Mapping是Elasticsearch中数据建模的基础,本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。
Mapping类似数据库中的表定义,主要作用如下:
定义索引下的字段名
定义字段的类型,比如数值型、字符串型、布尔型等
定义倒排索引相关的配置,比如是否索引、记录position等
使用API获取Mapping:
request:<code>GET /test_index/_mapping</code>
response:
核心数据类型
字符串型: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即可
在文档写入的时候,如果索引不存在,会自动创建索引
Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
但是有时候会推算的不对,例如地址位置信息
当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询
ES依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:
JSON类型
ES类型
null
忽略
boolean
浮点类型
float
整数
long
object
array
由第一个非null值的类型决定
string
匹配日期格式,设置为Date(默认开启);匹配数字,设置为float或者long(默认关闭);设置为Text,并且增加keyword子字段
当创建Index的时候,dynamic字段可以设置成3种值:true、false、strict。
例如:
true
false
strict
文档可索引
✅
❌
字段可索引
Mapping被更新
说明:
当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
当设置成strict的时候,数据写入直接报错。
自定义Mapping的一些建议
可以参考API手册,纯手写
为了减少工作量,减少出错率,可以参考以下步骤:
创建一个临时的index,写入一些样本数据
通过访问Mapping API获得该临时文本的动态Mapping定义
修改后,使用该配置创建索引
删除临时索引
ES能否更改Mapping的字段类型,需要分两种情况进行分析。
1. 新增字段
dynamic设置为true(默认值)时,一旦有新增字段的文档写入,Mapping也同时被更新。
dynamic设置为false时,Mapping不会被更新,更新字段的数据无法被索引,但是信息会出现在_source中,换言之,文档可以正常写入,但是无法对字段进行搜索。
dynamic设置为strict时,文档写入失败。
2. 对已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为ES是基于Lucene实现的倒排索引,一旦生成后,就不允许修改。因为如果修改了字段的数据类型,会导致已被索引的数据无法被搜索。如果希望修改字段类型,必须使用Reindex API进行重建索引。
copy_to
将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索
index
控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索。
例如某些场景希望敏感信息不用来做搜索,可以将index设置为false,则不可以用来搜索,也可以节省空间。
index_option用于控制倒排索引记录的内容,有4种配置:
docs只记录doc id
freqs记录doc id和term frequencies
positions记录doc id、term frequencies和term position
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
由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!