Elasticsearch中的mapping。
mapping表示索引库中数据的字段类型信息,类似于MySQL中的表结构信息。一般不需要手工指定mapping,因为ES会自动根据数据格式识别它的类型。如果你需要对某些字段添加特殊属性(例如:指定分词器),就必须手工指定字段的mapping。
下面先来看一下ES中的常用数据类型:

ES中还支持一些其他数据类型,感兴趣的话可以到文档里面看一下: https://www.elastic.co/guide/en/elasticsearch/reference/7.13/mapping-types.html
下面查询一下目前已有的索引库myschool的mapping信息:
[es@master elasticsearch]$ curl -XGET 'http://master:9200/myschool/_mapping?pretty'
{
"myschool" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
通过返回的mapping信息可以看到score这个索引库里面有2个字段,name和age。 1:name是text类型,其中还通过fields属性指定了一个keyword类型,表示name字段会按照text类型和keyword类型存储2份。"ignore_above" : 256,表示keyword类型最大支持的字符串长度是256。 ES默认会把字符串类型的数据同时指定text类型和keyword类型。想要实现分词检索的时候需要使用text类型,在代码层面直接指定这个name字段就表示使用text类型。想要实现精确查询的时候需要使用keyword类型,在代码层面指定name.keyword表示使用name的keyword类型。
2:age是long类型,整数默认会被识别为long类型。
注意:ES 7.x版本之前字符串默认只会被识别为text类型,不会附加一个keyword类型。
下面我们首先操作一个不存在的索引库的mapping信息: 指定name为text类型,并且使用ik分词器。 age为integer类型。
curl -H "Content-Type: application/json" -XPUT 'http://master:9200/test2' -d'{"mappings":{"properties":{"name":{"type":"text","analyzer": "ik_max_word"},"age":{"type":"integer"}}}}'
查看这个索引库的mapping信息。
[es@master elasticsearch]$ curl -XGET 'http://master:9200/test2/_mapping?pretty'
{
"test2" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"name" : {
"type" : "text",
"analyzer" : "ik_max_word"
}
}
}
}
}
注意:只能新增字段,不能修改已有字段的类型,否则会报错。
[es@master elasticsearch]$ curl -H "Content-Type: application/json" -XPOST 'http://master:9200/test2/_mapping' -d'{"properties":{"age":{"type":"long"}}}'
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [age] cannot be changed from type [integer] to [long]"}],"type":"illegal_argument_exception","reason":"mapper [age] cannot be changed from type [integer] to [long]"},"status":400}
可以假设一下,假设支持修改已有字段的类型,之前name是text类型,如果我修改为long类型,这样就会出现矛盾了,所以ES不支持修改已有字段的类型。
在已存在的索引库中增加一个flag字段,类型为boolean类型。
[es@master elasticsearch]$ curl -H "Content-Type: application/json" -XPOST 'http://master:9200/test2/_mapping' -d'{"properties":{"flag":{"type":"boolean"}}}'
{"acknowledged":true}
重新查看索引库的最新mapping信息。
[es@master elasticsearch]$ curl -XGET 'http://master:9200/test2/_mapping?pretty'
{
"test2" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "integer"
},
"flag" : {
"type" : "boolean"
},
"name" : {
"type" : "text",
"analyzer" : "ik_max_word"
}
}
}
}
}