当前位置: > > > Elasticsearch - mapping字段类型详解(附:增加新字段及其类型 )

Elasticsearch - mapping字段类型详解(附:增加新字段及其类型 )

1,基本介绍

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

(2)ES 中的常用数据类型如下:
  • 字符串:支持 textkeyword 类型
    • text 类型支持分词,支持模糊、精确查询,但是不支持聚合和排序操作,text 类型不限制存储的内容长度,适合大字段存储。
    • keyword 类型不支持分词,会直接对数据建立索引,支持模糊、精确查询,支持聚合和排序操作。keyword 类型最大支持存储内容长度为 32766UTF-8 类型的字符,可以通过设置 ignore_above 参数指定某个字段最大支持的字符长度,超过给定长度后的数据将不被索引,此时就无法通过 termQuery 精确查询返回结果了。keyword 类型适合存储手机号、姓名等不需要分词的数据。
  • 数字:最常用的就是 longdouble 了,整数使用 long、小数使用 double。当然也支持 integershortbytefloat 这些数据类型。
  • 日期:最常用的就是 date 类型了,date 类型可以支持到毫秒,如果特殊情况下需要精确到纳秒需要使用 date_nanos 这个类型。
    • 其中 date 日期类型可以自定义日期格式,通过 format 参数指定:{“type”:“date”,“format”:“yyyy-MM-dd”}
  • 布尔型:支持 true 或者 false
  • 二进制:该字段存储编码为 Base64 字符串的二进制值。如果想要存储图片,可以存储图片地址,或者图片本身,存储图片本身的话就需要获取图片的二进制值进行存储了。

2,查看 mapping 信息

(1)首先我们调用 ElasticsearchAPI 接口添加一些学院考试成绩数据:
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)下面查询一下目前已有的索引库 scoremapping 信息:
curl -XGET 'http://192.168.121.128:9200/score/_mapping?pretty'

(3)通过返回的 mapping 信息可以看到 score 这个索引库里面有 3 个字段,namescoresubject
  • nametext 类型,其中还通过 fields 属性指定了一个 keyword 类型,表示 name 字段会按照 text 类型和 keyword 类型存储 2 份。"ignore_above" : 256,表示 keyword 类型最大支持的字符串长度是 256
ES 默认会把字符串类型的数据同时指定 text 类型和 keyword 类型:
  • 想要实现分词检索的时候需要使用 text 类型,在代码层面直接指定这个 name 字段就表示使用 text 类型。
  • 想要实现精确查询的时候需要使用 keyword 类型,在代码层面指定 name.keyword 表示使用 namekeyword 类型。其实前面我们在讲排序的时候也用到了这个 keyword 类型的特性,因为直接指定 name 字段会使用 text 类型,text 类型不支持排序和聚合,所以使用的是 name.keyword
  • scorelong 类型,整数默认会被识别为 long 类型。
  • subject 也是 text 类型,和 name 是一样的。

3,增加索引库 mapping 信息

(1)首先我们创建一个索引库,通过 mapping 信息指定 nametext 类型,并且使用 ik 分词器。ageinteger 类型。
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"
              }
          }
      }'
  • 上面代码执行后会报如下错误。可以假设一下,假设支持修改已有字段的类型,之前 nametext 类型,如果我修改为 long 类型,这样就会出现矛盾了,所以 ES 不支持修改已有字段的类型。
评论0