Elasticsearch核心技术(三)(Mapping设置)
本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。
3.1 Mapping简介
3.1.1 什么是Mapping
Mapping类似数据库中的表定义,主要作用如下:
- 定义索引下的字段名
- 定义字段的类型,比如数值型、字符串型、布尔型等
- 定义倒排索引相关的配置,比如是否索引、记录position等
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即可
- 在文档写入的时候,如果索引不存在,会自动创建索引
- Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
- 但是有时候会推算的不对,例如地址位置信息
- 当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询
JSON类型 | ES类型 |
---|---|
null | 忽略 |
boolean | boolean |
浮点类型 | float |
整数 | long |
object | object |
array | 由第一个非null值的类型决定 |
string | 匹配日期格式,设置为Date(默认开启); 匹配数字,设置为float或者long(默认关闭); 设置为Text,并且增加keyword子字段 |
例如:
PUT movies
{
"mapping":{
"_doc":{
"dynamic":"false"
}
}
}
true | false | strict | |
---|---|---|---|
文档可索引 | ? | ? | ? |
字段可索引 | ? | ? | ? |
Mapping被更新 | ? | ? | ? |
- 当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
- 当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
- 当设置成strict的时候,数据写入直接报错。
- 可以参考API手册,纯手写
- 为了减少工作量,减少出错率,可以参考以下步骤:
- 创建一个临时的index,写入一些样本数据
- 通过访问Mapping API获得该临时文本的动态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种配置:
- 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会忽略该值;可以通过设定该属性设定字段的默认值。
推荐阅读
- 期刊|期刊 | 国内核心期刊之(北大核心)
- GIS跨界融合赋能多领域技术升级,江淮大地新应用成果喜人
- 活跃社群的核心标准是什么()
- 深入浅出谈一下有关分布式消息技术(Kafka)
- VueX--VUE核心插件
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 核心
- 2月2日日课总结(基因技术)
- NAT(网络地址转换技术)
- 云原生微服务技术趋势解读