跳至正文
StackBug
返回

为什么 Elasticsearch 精确查询要用 keyword?

为什么 Elasticsearch 精确查询要用 keyword?

在使用 Elasticsearch 的过程中,很多同学都会遇到一个问题: 明明字段里有值,但直接用 term 查询查不到,非要写.keyword才能命中。

比如下面的查询:

{
  "query": {
    "term": {
      "attributionId": "A08"
    }
  }
}

可能查不到结果,而改成这样就能查到:

{
  "query": {
    "term": {
      "attributionId.keyword": "A08"
    }
  }
}

这是为什么呢?


1. Elasticsearch 的字段类型

Elasticsearch 的字符串类型字段分为两种主要 mapping:

text

keyword


2. 为什么 .keyword 能查到?

大多数情况下,我们在定义字符串字段时,如果没特别指定,Elasticsearch 会自动建一个 multi-field:

"attributionId": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}

这意味着:

所以:


3. 如何选择查询方式?

精确匹配(id、编码、枚举类型) 用.keyword

{ "term": { "attributionId.keyword": "A08" } }

全文搜索(标题、描述、内容) 用match或查原始字段:

{ "match": { "title": "Elasticsearch 教程" } }

4. 最佳实践

建模时区分好字段类型

查询时用对字段


5. 总结

查不到数据并不是 ES “坏了”,而是你查错了字段。


分享到:

上一篇
多种设计模式在知识点卡片查询中的组合应用
下一篇
生产环境大表新增字段的风险与最佳实践