Elasticsearch核心技术(三)(Mapping设置)

本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。
3.1 Mapping简介 3.1.1 什么是Mapping Mapping类似数据库中的表定义,主要作用如下:

  1. 定义索引下的字段名
  2. 定义字段的类型,比如数值型、字符串型、布尔型等
  3. 定义倒排索引相关的配置,比如是否索引、记录position等
使用API获取Mapping:
request:GET /test_index/_mapping
response:
{ "test_index" : { "mappings" : { "properties" : { "age" : { "type" : "long" },"username" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } } } } } }

3.1.2 Mapping支持的数据类型
  • 核心数据类型
    • 字符串型:text、keyword
    • 数值型:long、integer、short、byte、double、float、half_float、scaled_float
    • 日期类型:date
    • 布尔类型:boolean
    • 二进制类型:binary
    • 范围类型:integer_range、float_range、long_range、double_range、data_range
  • 复杂类型
    • 数组类型:array
    • 对象类型:object
    • 嵌套类型:nested object
  • 特殊类型
    • 地理位置:geo_point、geo_shape、
    • IP地址:IPv4、IPv6
    • 自动补全:complete
    • percolator
  • 多字段特性:multi-fields
    • 允许对同一字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索
    • 实现方式:在人名中新增一个子字段为pinyin即可
3.2 Dynamic Mapping 3.2.1 什么是Dynamic Mapping
  • 在文档写入的时候,如果索引不存在,会自动创建索引
  • Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
  • 但是有时候会推算的不对,例如地址位置信息
  • 当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询
3.2.2 类型的自动识别 ES依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:
JSON类型 ES类型
null 忽略
boolean boolean
浮点类型 float
整数 long
object object
array 由第一个非null值的类型决定
string 匹配日期格式,设置为Date(默认开启); 匹配数字,设置为float或者long(默认关闭); 设置为Text,并且增加keyword子字段
3.2.3 Dynamic的设置 当创建Index的时候,dynamic字段可以设置成3种值:true、false、strict。
例如:
PUT movies { "mapping":{ "_doc":{ "dynamic":"false" } } }

true false strict
文档可索引 ? ? ?
字段可索引 ? ? ?
Mapping被更新 ? ? ?
【Elasticsearch核心技术(三)(Mapping设置)】说明:
  • 当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
  • 当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
  • 当设置成strict的时候,数据写入直接报错。
3.3 自定义Mapping 3.3.1如何自定义Mapping 自定义Mapping的一些建议
  • 可以参考API手册,纯手写
  • 为了减少工作量,减少出错率,可以参考以下步骤:
    1. 创建一个临时的index,写入一些样本数据
    2. 通过访问Mapping API获得该临时文本的动态Mapping定义
    3. 修改后,使用该配置创建索引
    4. 删除临时索引
3.3.2 能否更改Mapping的字段类型 ES能否更改Mapping的字段类型,需要分两种情况进行分析。
1. 新增字段
dynamic设置为true(默认值)时,一旦有新增字段的文档写入,Mapping也同时被更新。
dynamic设置为false时,Mapping不会被更新,更新字段的数据无法被索引,但是信息会出现在_source中,换言之,文档可以正常写入,但是无法对字段进行搜索。
dynamic设置为strict时,文档写入失败。
2. 对已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为ES是基于Lucene实现的倒排索引,一旦生成后,就不允许修改。因为如果修改了字段的数据类型,会导致已被索引的数据无法被搜索。如果希望修改字段类型,必须使用Reindex API进行重建索引。
3.4 Mapping常用参数说明
  • copy_to
    将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索
  • index
    控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索。
    例如某些场景希望敏感信息不用来做搜索,可以将index设置为false,则不可以用来搜索,也可以节省空间。
    index_option用于控制倒排索引记录的内容,有4种配置:
    1. docs只记录doc id
    2. freqs记录doc id和term frequencies
    3. positions记录doc id、term frequencies和term position
    4. offsets记录doc id、term frequencies、term position和character offsets
      text类型默认配置为positions。其他默认是docs。当然记录内容越多,占用空间越大。
  • null_value
    当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值;可以通过设定该属性设定字段的默认值。
更多常用参数可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html

    推荐阅读