elasticsearch 映射数据类型:keyword和ignore_above

keyword

字符串,精确匹配,不可分词,数据会作为完整字段进行匹配。也可以通过 wildcard 进行模糊查询

  • 查询时,相当于 sql中的 =,如SQL:select * from 表 where name = '李雷'

  • 通过 wildcard 也可以进行模糊查询,如 SQL:select * from 表 where name like '李雷%'

注意: ES中,类型 可以 影响 查询的方式。这与 MySQL 不同

ignore_above

创建 mapping 时,可以为字符串(专指 keyword 类型) 指定 ignore_above ,用来 限定字符长度。超过 ignore_above 的字符 会被存储,但不会被索引。

注意,是字符长度,一个英文字母是一个字符,一个汉字也是一个字符。

在动态生成的 mapping 中,keyword类型会被设置ignore_above: 256。

ignore_above 可以在创建 mapping 时指定。

测试

设置 message 的长度最长为20,超过20的不被索引,这里的不被索引是这个字段不被索引,但是该document中的其他字段仍然可以被索引到。

PUT my_index
{
  "mappings" : {
    "properties" : {
      "message" : {
        "type" : "keyword",
        "ignore_above": 4
      }
    }
  }
}

添加数据

POST /my_index/_doc
{ "message": "1234"}


POST /my_index/_doc
{ "message": "123456"}

查询全部

GET /my_index/_search
{
  "query": {
    "match_all": {}
  }
}

添加的记录全部能查询到

模糊查询

相当于执行 SQL:select * from my_index where message like '123%'

GET /my_index/_search
{
  "query": {
     "wildcard": {
      "message": {
        "value": "123*"
      }
    }
  }
}

查询结果如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "message" : "1234"
        }
      }
    ]
  }
}

只能查询出 "message" : "1234",超过4个字符的,不能被索引到

修改 ignore_above

PUT my_index/_mappings
{
  "properties" : {
    "message" : {
      "type" : "keyword",
      "ignore_above": 128
    }
  }
}

再次模糊查询

只能查询出 "message" : "1234",超过4个字符的,不能被索引到

结论

说明数据在添加时,已经做额外处理。之后即使修改数据类型,也还是查不到

新添加数据能查询到

添加新数据,是可以查询到的

添加新数据:

POST /my_index/_doc
{ "message": "1234567"}

再次模糊查询,可以查询到


原文出处:/show_1IX1rVPpjZKS.html