Match_phrase 弹性搜索没有按预期工作

Match_phrase is elastic search not working as expected

在我的弹性搜索中,我有包含值“abc”和“abc-def”的“fieldname”的文档。当我使用 match_phrase 查询来搜索字段名为“abc”的文档时,它也会返回值为“abc-def”的文档。但是,当我查询“abc-def”时,它工作正常。我的查询如下:

  Get my_index/_search
   {
     "query" : {
           "match_phrase" : {"fieldname" : "abc"}
       }
   }

有人可以帮助我理解这个问题吗?

  1. match_phrase query analyzes the search term based on the analyzer provided for the field (if no analyzer is added then by default standard analyzer 已使用)。

匹配短语查询搜索字段中包含所有词条(来自搜索词条)的那些文档,并且这些词条必须以正确的顺序出现。

  1. 在你的例子中,"abc-def" 被标记化为 "abc""def"(因为标准分析器)。现在,当您对 "abc-def" 使用匹配短语查询时,这将搜索具有相同顺序的 abcdef 的所有文档。 (因此您在结果中只得到 1 个文档)

  2. 当搜索 "abc" 时,这将搜索那些在 fieldname 字段中具有 abc 的文档(因为两个文档都包含 abc, 所以结果都是 returned)

如果你想return在结果中只精确匹配文档,那么你需要改变分析术语的方式。

  1. 如果您没有明确定义任何映射,则需要将 .keyword 添加到 fieldname 字段。这使用关键字分析器而不是标准分析器(注意 fieldname 字段后的“.keyword”)。

添加包含索引数据、映射、搜索查询和搜索结果的工作示例

索引数据:

{
    "name":"abc-def"
}
{
    "name":"abc"
}

搜索查询:

{
  "query": {
    "match_phrase": {
      "name.keyword": "abc"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "67394740",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.6931471,
        "_source": {
          "name": "abc"
        }
      }
    ]