Elasticsearch - mapping字段类型详解(附:增加新字段及其类型 )
1,基本介绍
(1)mapping 表示索引库中数据的字段类型信息,类似于 MySQL 中的表结构信息。
- 一般不需要手工指定 mapping,因为 ES 会自动根据数据格式识别它的类型
- 如果你需要对某些字段添加特殊属性(例如:指定分词器),就必须手工指定字段的 mapping。
(2)ES 中的常用数据类型如下:
- 字符串:支持 text 和 keyword 类型
- text 类型支持分词,支持模糊、精确查询,但是不支持聚合和排序操作,text 类型不限制存储的内容长度,适合大字段存储。
- keyword 类型不支持分词,会直接对数据建立索引,支持模糊、精确查询,支持聚合和排序操作。keyword 类型最大支持存储内容长度为 32766 个 UTF-8 类型的字符,可以通过设置 ignore_above 参数指定某个字段最大支持的字符长度,超过给定长度后的数据将不被索引,此时就无法通过 termQuery 精确查询返回结果了。keyword 类型适合存储手机号、姓名等不需要分词的数据。
- 数字:最常用的就是 long 和 double 了,整数使用 long、小数使用 double。当然也支持 integer、short、byte、float 这些数据类型。
- 日期:最常用的就是 date 类型了,date 类型可以支持到毫秒,如果特殊情况下需要精确到纳秒需要使用 date_nanos 这个类型。
- 其中 date 日期类型可以自定义日期格式,通过 format 参数指定:{“type”:“date”,“format”:“yyyy-MM-dd”}
- 布尔型:支持 true 或者 false。
- 二进制:该字段存储编码为 Base64 字符串的二进制值。如果想要存储图片,可以存储图片地址,或者图片本身,存储图片本身的话就需要获取图片的二进制值进行存储了。

2,查看 mapping 信息
(1)首先我们调用 Elasticsearch 的 API 接口添加一些学院考试成绩数据:
curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/1' -d'{"name":"tom","subject":"chinese","score":59}' curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/2' -d'{"name":"tom","subject":"math","score":89}' curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/3' -d'{"name":"jack","subject":"chinese","score":78}' curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/4' -d'{"name":"jack","subject":"math","score":85}' curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/5' -d'{"name":"jessica","subject":"chinese","score":97}' curl -H "Content-Type: application/json" -XPOST 'http://192.168.121.128:9200/score/_doc/6' -d'{"name":"jessica","subject":"math","score":68}'
(2)下面查询一下目前已有的索引库 score 的 mapping 信息:
curl -XGET 'http://192.168.121.128:9200/score/_mapping?pretty'
(3)通过返回的 mapping 信息可以看到 score 这个索引库里面有 3 个字段,name、score 和 subject。
- name 是 text 类型,其中还通过 fields 属性指定了一个 keyword 类型,表示 name 字段会按照 text 类型和 keyword 类型存储 2 份。"ignore_above" : 256,表示 keyword 类型最大支持的字符串长度是 256。
ES 默认会把字符串类型的数据同时指定 text 类型和 keyword 类型:
- 想要实现分词检索的时候需要使用 text 类型,在代码层面直接指定这个 name 字段就表示使用 text 类型。
- 想要实现精确查询的时候需要使用 keyword 类型,在代码层面指定 name.keyword 表示使用 name 的 keyword 类型。其实前面我们在讲排序的时候也用到了这个 keyword 类型的特性,因为直接指定 name 字段会使用 text 类型,text 类型不支持排序和聚合,所以使用的是 name.keyword。
- score 是 long 类型,整数默认会被识别为 long 类型。
- subject 也是 text 类型,和 name 是一样的。
3,增加索引库 mapping 信息
(1)首先我们创建一个索引库,通过 mapping 信息指定 name 为 text 类型,并且使用 ik 分词器。age 为 integer 类型。
curl -H "Content-Type: application/json" \ -XPUT 'http://192.168.121.128:9200/test2' \ -d '{ "mappings": { "properties": { "name": { "type": "text", "analyzer": "ik_max_word" }, "age": { "type": "integer" } } } }'
- 查看这个索引库的 mapping 信息:
curl -XGET 'http://192.168.121.128:9200/test2/_mapping?pretty'

(2)接着在这个已存在的索引库中增加 mapping 信息,我们执行如下命令增加一个 flag 字段,类型为 boolean 类型。
curl -H "Content-Type: application/json" \ -XPOST 'http://192.168.121.128:9200/test2/_mapping' \ -d '{ "properties": { "flag": { "type": "boolean" } } }'
- 查看索引库的最新 mapping 信息:
curl -XGET 'http://192.168.121.128:9200/test2/_mapping?pretty'

(3)要注意的是我们只能新增字段,不能修改已有字段的类型,否则会报错。例如我们将已有的 age 字段修改成 long 类型。
curl -H "Content-Type: application/json" \ -XPOST 'http://192.168.121.128:9200/test2/_mapping' \ -d '{ "properties": { "age": { "type": "long" } } }'
- 上面代码执行后会报如下错误。可以假设一下,假设支持修改已有字段的类型,之前 name 是 text 类型,如果我修改为 long 类型,这样就会出现矛盾了,所以 ES 不支持修改已有字段的类型。
