mapping简介
- mapping 类似数据库中的表结构定义,主要作用如下:
(1)定义Index下的字段名(Field Name)
(2)定义字段的类型。比如数值型、字符串型、布尔型等
(3)定义倒排索引相关的配置。比如是否索引、记录position等 - 获取一个索引的mapping
自定义mapping
-
自定义mapping的api 如下:
PUT work_index { "mappings": { //mapping关键词 "doc":{ //type名称,直接默认写doc不变 "properties": { //在下面开始定义索引里的字段名称和类型 "name":{ "type": "text" //字段类型 }, "gender":{ "type": "integer" }, "job":{ "type": "keyword" } } } } }
示例如图:
-
mapping中的字段类型一旦设定后,禁止直接修改,原因为:
Lucene实现的倒排索引生成后不允许修改
重新建立的新索引,然后做reindex操作,把所有的文档重新导入到新的文档 -
允许新增字段,通过dynamic参数来控制字段的新增
true(默认)允许自动新增字段;false 不允许自动新增字段,但文档可以正常的写入,但无法对字段进行查询等操作;strict 稳定不能写入,报错
-
copy_to 将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索
-
index 控制当前字段是否索引,默认为true,记录索引;false不记录,即不可搜索,不存索引可以节省大量的磁盘和内存空间
-
index_options 用于控制倒排索引记录的内容,有如下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会忽略该值。可以通过设定该值来设定字段的默认值
更多自定义参数可查看官方文档 — Mapping
数据类型
-
核心数据类型
字符串型 text、keyword
数值型 long、integer、short、byte、double、float、half_float、scaled_float
日期类型 date
布尔类型 boolean
二进制类型 binary
范围类型 integer_range、float_range、long_range、double_range、date_range
如果清楚知道字段要设置的类型,最好作为选择,比如,float 比double可以节省近50%的存储空间 -
复杂数据类型
数组类型 array
对象类型 object
嵌套类型 nested object (与object不同是此类型会被特殊处理,文档不会和父文档混在一起) -
地理位置数据类型
geo_point
geo_shape -
专用类型
记录ip地址:ip
实现自动补全:completion
记录分词数:token_count
记录字符串hash值:murmur3
percolator
父子查询:join -
多字段特性multi-fields
允许对同一个字段采用不同的配置,比如分词,常见例子如 对人名实现拼音搜索,只需要在人名中新增一个子字段为pinyin即可(要安装文字转拼音插件)PUT multi_index { "mappings": { "doc": { "properties": { "name": { "type": "keyword", "fields": { "pinyin":{ "type": "text", "analyzer": "pinyin" } } } } } } }
dynamic mapping
- es可以自动识别文档字段类型,从而降低用户使用成本,如下所示:
- es是依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:
JSON类型 | es类型 |
---|---|
null | 忽略 |
boolean | boolean |
浮点类型 | float |
整数 | long |
object | object |
array | 由第一个非null值的类型决定 |
string | 匹配为日期则设为date类型(默认开启);匹配为数字的话设为float或long类型(默认关闭);设为text类型,并附带keyword的子字段 |
- 日期的自动识别可以自行设置日期格式,以满足各种要求
默认是[“strict_date_optional_time”,“yyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z”]
strict_date_optional_time是ISO datetime的格式
dynamic_date_formats 可以自定义日期类型
date_detection 可以关闭日期自动识别的机制
- 字符串的数字时,默认是不会自动识别为整型,因为字符串中出现数字是完全合理的
- numeric_detection 可以开启字符串中数字的自动识别
dynamic template
允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:
所有字符串类型都设定为 keyword类型,即默认不分词
所有以message开头的字段都设定为text类型,即分词
所有以long_开头的字段都设定为long类型
所有自动匹配为double类型的都设定为float类型,节省空间
PUT my_index
{
"mappings": {
"doc":{
"dynamic_templates":[{ //数组,可指定多个匹配规则
"strings":{ //template 名称
"match_mapping_type":"string", //匹配规则
"match": "message*", //以message开头的字段设置为keyword
"mapping":{ //设置信息
"type": "keyword"
}
}
}]
}
}
}
示例如下:
自定义mapping的建议
自定义mapping 的操作步骤如下:
1、写入一条文档到es的临时索引中,获取es自动生成的 mapping
2、修改步骤1得到的 mapping,自定义相关配置
3、使用步骤2的mapping创建实际所需索引
索引模板
英文为 Index Template,主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤
可以设定索引的配置和 mapping
可以有多个模板,根据order设置,order大的覆盖小的配置
PUT _template/test_template
{
"index_patterns":["te*","bar*"], //匹配的索引名称
"order":0, //每个模板的执行顺序号
"settings": {
"number_of_shards": 1
},
"mappings": {
"docs":{
"_source": { 不记录原始数据
"enabled": false
},
"properties": {
"name":{
"type": "keyword"
}
}
}
}
}
GET _template 获取所有模板
GET _template/test_template 获取指定模板
DELETE _template/test_template 删除指定模板