如何在 Elasticsearch 中通过完全匹配的字段搜索查询

How to search query by field with exact match in Elasticsearch

我正在尝试按字段值搜索文档。该字段是在索引中定义的字符串类型,如下所示:

"field" : { 
        "type" : "string"
 }

除映射外,索引没有其他设置。

我尝试了各种查询以尝试查找包含 field="test" 的文档,但每次我都没有得到任何结果或包含该子字符串 "test" 的结果。我想要 "field""test" 完全匹配的文档。

我尝试了 matchmatch_phrasetermquery_string,none 似乎如我所愿。

您需要使用 term 带有这样关键字的查询

{
   "query" : {
      "term" : {
         "field.keyword" : "test"
      }
   }
}

希望这对您有所帮助。

看来您使用的是版本 6 之前的 Elasticsearch 版本,该版本仍然支持 String 类型。更新版本的 Elasticsearch 将 string 字段类型替换为 keywordtext 类型,以便更轻松地支持 exact-matchfull-text 这两个用例] 搜索用例。

您需要更改映射以支持精确匹配搜索,如下所示:

{
  "field": {
    "type" "string",
    "index": "not_analyzed"
  }
}

由于您无法更改现有映射,因此您需要对新索引进行更改并重新索引所有内容。

如果您使用的是 Elasticsearch 版本 6+,只需使用 keyword 类型的字段进行精确匹配搜索。默认情况下,字符串字段会映射到由 2 个字段组成的多字段:

  • text 类型之一(用于全文搜索),由
  • 引用
  • keyword 类型之一(用于精确匹配搜索),由 .keyword
  • 引用

特此发布关于该主题的有趣博客 post:Strings are dead, long live strings!