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
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "keyword"
},
"age": {
"type": "long"
}
}
}
}

dynamic参数

Mapping中的字段类型一旦设定后,就禁止直接修改,主要原因是Lucene为了提高效率,不允许直接修改mapping,一旦修改,会影响倒排索引的方式。但是允许我们新增字段,通过dynamic参数来控制字段的新增:

  • true:默认,允许自动新增字段
  • false:不允许自动新增字段,但是文档可以正常写入,但无法对该字段进行查询等操作
  • strict:文档不能写入,报错

新增otherField字段

PUT put_mapping/_doc/1
{
"otherField":"someValue"
}

可以查询到otherField字段

POST put_mapping/_search
{
"query": {
"match": {
"otherField": "someValue"
}
}
}

修改dynamic为false

新增anotherField字段

PUT put_mapping/_doc/1
{
"anotherField":"someValue"
}

查询,anotherField没有被查到

POST put_mapping/_search
{
"query": {
"match": {
"anotherField": "someValue"
}
}
}

修改dynamic为strict

PUT put_mapping/_mapping
{
"dynamic": "strict"
}

新增字段会直接报错

PUT put_mapping/_doc/2
{
"anotherField1":"someValue"
}

copy_to参数

将该字段的值复制到目标字段

PUT /put_mapping1
{
"mappings": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name"
},
"last_name": {
"type": "text",
"copy_to": "full_name"
},
"full_name": {
"type": "text"
}
}
}
}

创建一个文档

PUT put_mapping1/_doc/1
{
"first_name": "John",
"last_name": "Smith"
}

根据full_name查询文档

GET put_mapping1/_search
{
"query": {
"match": {
"full_name": {
"query": "John Smith"
, "operator": "and"
}
}
}
}

index参数

控制当前字段是否索引,默认为true,即记录索引,false不记录索引,即不可搜索

PUT /put_mapping2
{
"mappings": {
"properties": {
"name": {
"type": "text"

},
"age": {
"type": "long",
"index": false
}
}
}
}

创建一个文档

PUT put_mapping2/_doc/1
{
"name": "John",
"age": 20
}

根据age字段搜索

GET put_mapping2/_search
{
"query": {
"match": {
"age": 20
}
}
}

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
{
"mappings": {
"properties": {
"name": {
"type": "text"
, "index_options": "positions"
},
"age": {
"type": "long"
}
}
}
}

null_value

当字段遇到null值时处理的策略,默认为null,此时es会忽略,可以设置该值,来设定字段的默认值

PUT /put_mapping4
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"sex": {
"type": "keyword",
"null_value": "男"
}
}
}
}

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
{
"name": "John",
"age": 20,
"birth": "1996-10-01",
"married": false,
"year": "2021",
"tags": ["boy","fashion"],
"money": 100.01
}

查看数据类型

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
{
"mappings": {
"dynamic_date_formats": ["MM/dd/yyyy"],
}
}

创建一个文档

PUT put_mapping/_doc/1
{
"name": "John",
"age": 20,
"birth": "10/01/1996"
}

设置date_detection为false,关闭日期自动识别

数字识别

es默认不会在字符串中自动识别数字,可以通过 numeric_detection 开启字符串中数字的自动识别

PUT /put_mapping
{
"mappings": {
"numeric_detection": true
}
}

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
{
"mappings": {
"dynamic_templates": [
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keywaord"
}
}
}
]
}
}

将所有以message开头的都设定为text类型

PUT /put_mapping
{
"mappings": {
"dynamic_templates": [
{
"message_as_text": {
"match_mapping_type": "string",
"match": "message",
"mapping": {
"type": "text"
}
}
}
]
}
}