Mapping类似于数据库中的表结构定义,主要作用如下:
- 定义 Index 下的字段名(Field Name)
- 定义字段的类型,比如数值型、字符型、布尔型等
- 定义倒排索引相关的配置,比如是否索引、记录position等
数据类型
核心数据类型:
字符串型 text、keyword
数值型:log、integer、short、byte、double、float、half_float、scaled_float
布尔:boolean
日期:date
二进制:binary
范围类型:integer_range、float_range、long_range、double_range、date_range
复杂数据类型:
- 数组类型 array
- 对象类型 object
- 嵌套类型 nested object
地理位置数据类型:
- geo_point
- geo_shape
专用类型:
- 记录ip地址 ip
- 实现自动补全 completion
- 记录分词数 token_count
- 记录字符串hash值 murmur3
- percolator
- join
多字段特征 multi-fields:
- 允许对同一个字段采用不同的配置,比如对人名可以进行拼音搜索
自定义Mapping
PUT /put_mapping |
dynamic参数
Mapping中的字段类型一旦设定后,就禁止直接修改,主要原因是Lucene为了提高效率,不允许直接修改mapping,一旦修改,会影响倒排索引的方式。但是允许我们新增字段,通过dynamic参数来控制字段的新增:
- true:默认,允许自动新增字段
- false:不允许自动新增字段,但是文档可以正常写入,但无法对该字段进行查询等操作
- strict:文档不能写入,报错
新增otherField字段
PUT put_mapping/_doc/1 |
可以查询到otherField字段
POST put_mapping/_search |
修改dynamic为false
新增anotherField字段
PUT put_mapping/_doc/1 |
查询,anotherField没有被查到
POST put_mapping/_search |
修改dynamic为strict
PUT put_mapping/_mapping |
新增字段会直接报错
PUT put_mapping/_doc/2 |
copy_to参数
将该字段的值复制到目标字段
PUT /put_mapping1 |
创建一个文档
PUT put_mapping1/_doc/1 |
根据full_name查询文档
GET put_mapping1/_search |
index参数
控制当前字段是否索引,默认为true,即记录索引,false不记录索引,即不可搜索
PUT /put_mapping2 |
创建一个文档
PUT put_mapping2/_doc/1 |
根据age字段搜索
GET put_mapping2/_search |
index_options参数
用于控制倒排索引记录的内容,有如下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,记录越多,占用空间越大
PUT /put_mapping3 |
null_value
当字段遇到null值时处理的策略,默认为null,此时es会忽略,可以设置该值,来设定字段的默认值
PUT /put_mapping4 |
dynamic mapping
es会根据json数据类型自动识别文档的字段类型,从而降低用户使用的成本
JSON类型 | ElasticSearch类型 |
---|---|
null | 忽略 |
boolean | boolean |
浮点数 | float |
整数 | long |
object | object |
array | 由第一个非null类型决定 |
string | 匹配为日期设为date(默认开启);匹配数字的话设为float或long(默认关闭);设为text类型,附带keyword子字段 |
创建一个文档
PUT put_mapping4/_doc/1 |
查看数据类型
GET put_mapping4/_mapping |
日期识别
es默认的日志识别格式是:
- strict_date_optional_time ISO datetime格式
- yyyy/MM/dd HH:mm:ss Z
- yyyy/MM/dd Z
日期的自动识别可以自行配置日期格式,以满足自己特定的需求:
- dynamic_date_formats 可以自定义日期格式
- date_detection 可以关闭日期自动识别机制
创建一个 MM/dd/yyyy 日期识别机制
PUT /put_mapping |
创建一个文档
PUT put_mapping/_doc/1 |
设置date_detection为false,关闭日期自动识别
数字识别
es默认不会在字符串中自动识别数字,可以通过 numeric_detection 开启字符串中数字的自动识别
PUT /put_mapping |
dynamic templates
允许es自动识别数据类型、字段名来动态设定字段类型,可实现如下效果:
- 所有字符串都设定为keyword类型
- 所有以message开头的字段都设定为text类型
- 所有以log_开头的字段都设定为long类型
- 所有自动匹配为double类型的都设为float类型,以节省空间
匹配规则一般有如下几个参数:
- match_mapping_type 匹配es自动识别的字段类型
- match,unmatch 匹配字段名
- path_match,path_unmatch 匹配路径
将所有自动匹配string类型的都设定为keyword类型
PUT /put_mapping |
将所有以message开头的都设定为text类型
PUT /put_mapping |