【问题标题】:How to search query by field with exact match in Elasticsearch如何在 Elasticsearch 中按完全匹配的字段搜索查询
【发布时间】:2020-03-01 14:48:33
【问题描述】:

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

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

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

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

我尝试了matchmatch_phrasetermquery_string,但似乎都没有按我的意愿工作。

【问题讨论】:

    标签: elasticsearch elasticsearch-dsl


    【解决方案1】:

    你需要使用term这样的关键字查询

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

    希望这会有所帮助。

    【讨论】:

    • 我怀疑这是对原始问题的正确答案,因为问题中的映射使用 string 类型。一种在早期版本的 Elasticsearch 中可用的类型,而答案是依赖于类型 keyword 的映射,这是一种用于支持精确匹配搜索、排序和分析的新类型。
    【解决方案2】:

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

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

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

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

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

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

    特此发表一篇关于该主题的有趣博文:Strings are dead, long live strings!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      相关资源
      最近更新 更多