20-12-24 Elasticsearch专题

226 阅读2分钟

Elasticsearch与传统数据库对比

RelationalDBElasticsearch
数据库(database)索引(indices)
表(tables)types
行(row)documents
字段(columns)fields

Elasticsearch数据类型

  1. 字符串类型: text, keyword
  2. 数值类型: long, integer, short, byte, double, float, half_float, scaled_float
  3. 日期类型: date
  4. 布尔类型: boolean
  5. 二进制类型: binary
  6. 在Elasticsearch中,没有专用的array数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的数据类型。这一点是区别于nested的,nested指的对象的集合。而arrays则是单一类型的数组集合而已。此外,不需要专门的类型类定义数组类型。

基础操作

建立带类型的索引

PUT /test2
{
    mappings: {
        properties: {
            name: {
                type: 'text'
            }
        }
    }
}

// 废弃
PUT /test2
{
    mappings: {
    	user: {
          properties: {
              name: {
                  type: 'text'
              }
          }
        }
    }
}

ES的开发者最初希望让用户这样理解,“索引”类似于SQL数据库中的“数据库”,type等价于table。 这被认为是一个糟糕的类比,导致了错误的假设。因为在SQL数据库中,表是相互独立(BC范式以后),一个表中的列与另一个表中具有相同名称的列没有关联,但这不是映射类型中的字段的情况,比如上面的user和tweet两个type都有user_name这个字段。 1.在ElasticSearch索引中,因为是封装的lucene,lucene解决这个问题的办法是:不同type中具有相同名称的字段在内部会是一个相同的Lucene field。换句话说,使用上面的示例,user中的user_name字段存储在与tweet类型中的user_name字段是被储存成完全相同的字段中,并且两个user_name字段在两种类型中必须具有相同的定义,比如想要对这个字段进行统一操作,这个字段的type必须相同。所以假如在同一索引中删除user被存成long的“ID”字段,由于tweet存成了“keyword”,那这就有可能会导致失败。 2.此外,在同一索引中存储很少或没有共同字段的不同实体会导致数据稀疏,并干扰Lucene有效压缩文档的能力。 由于这些原因,所以从ES删除多个映射类型的概念。

查询索引字段的类型

GET /test2

分词

let result = await axios({
  method: 'post',
  url: 'http://localhost:9200/_analyze',
  data: {
    "analyzer": "ik_smart",
    "text": str
  }
});

elasticsearch的特殊请求格式

blog.csdn.net/sunshine050…