跳至正文

Elasticsearch Mapping 和 Setting

Mapping

是定义文档及其包含的字段的存储和索引方式的过程,相当于关系型数据库中定义数据库和表结构的语句

核心数据类型 Core datatypes

  • 字符串(string) : text 和 keyword
  • 数字(numeric): long ,integer ,short byte double float half_float scaled_float
  • 日期(date): date date_nanos (纳秒)
  • 布尔(boolean)
  • 二进制 (Binary)

复杂数据类型 Complex datatypes

  • Object json对象
  • Nested 嵌套类型

Geo 数据类型 (地理位置)

专有数据类型 Specialised datatypes

  • IP IPv4 and IPv6

Range 范围

https://www.elastic.co/guide/en/elasticsearch/reference/current/range.html

数组

在Es中数组不需要专门定义,任何字段都可以包含另个或多个值即数组,数组中的所有制都必须具有相同的数据类型。

多字段 Multi-fileds

为不同的目的以不同的方式为同一字段建立索引

设置多个字段可以使用不同方式索引,使用不同的analyzer

PUT my_index
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": { 
            "type":  "keyword"
          }
        }
   },
   "comment": {
        "type": "text",
        "fields": {
          "english_comment": { 
            "type":  "text",
             "analyzer":"english",
             "search_analyzer":"english"
          }
        }
      }
    }
  }
}

Dynamic Mapping 自动创建Mapping

创建index时,不需要定义Mapping,Es根据数据类型自动判断创建类型,优点是方便,缺点是有时后自动创建类型不是你想要的数据类型。

Mapping 字段类型修改机制

1.新增字段

Dynamic 设置为true时,一旦新增字段的文档写入,Mapping也同时被更新

Dynamic 设置为false,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中。

Dynamic设置成Strict,文档写入失败

2.已有字段,一旦已经有数据写入,就不再支持修改字段定义

Lucene实现的倒排索引,一旦生成后,就不允许修改

3.如果希望改变字段类型,必须Reindex Api,重建索引,因为如果修改了字段的数据类型,会导致已经索引的数据数据无法被搜索,新增自担不会有这种影响。

PUT movies
{
 "mappings":{
    "_doc":{
      "dynamic":"false"
    }
 }
}

自定义Mapping

1.参考API手册,纯手写

2.为了减少输入的工作量,减少出错概率,可以依靠以下步骤

  • 创建临时的index,写入一些样本数据
  • 通过访问Mapping API获取该临时文件的动态Mapping 定义
  • 修改后使用该配置创建你的索引
  • 删除临时索引

Index Options

四种不同界别的Index Options 配置,可以控制倒排索引记录的内容

  • docs – 记录doc id
  • freqs – 记录doc id 和 term frequencies
  • postions – 记录 doc id / term frequencies /term positon
  • offsets – 记录 doc id / term frequencies /term posistion / character offects

Text类型默认记录postions,其它默认为docs

记录内容越多,占用存储空间越大

null value

设置null_value 属性可以搜索null值

PUT users
{
  "mappings":{
    "properties":{
      "firstName":{
       "type":"text",
       "index":false //不索引该字段
      },
     "bio":{
       "type":"text",
       "index_options":"offsets"
     },
     "mobile":{
       "type":"text",
       "null_value":"NULL"
     }
   }
  }
}

精确值和全文本 Exact values vs Full Text

精确值不需要做分词处理

创建自定义分词器