0

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

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

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

4

1 回答 1

1
  1. match_phrase查询根据为字段提供的分析器分析搜索词(如果未添加分析器,则默认使用标准分析器)。

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

  1. 在您的情况下,"abc-def"被标记为"abc"and "def"(由于标准分析器)。现在,当您对 使用匹配短语查询时"abc-def",它会搜索同时具有这两者abcdef顺序相同的所有文档。(因此您在结果中只得到 1 个文档)

  2. 搜索 时,这将搜索该字段中的"abc"那些文档(因为两个文档都包含,所以两者都在结果中返回)abcfieldnameabc

如果您只想在结果中返回完全匹配的文档,那么您需要更改分析术语的方式。

  1. 如果您没有明确定义任何映射,那么您需要添加.keyword到该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"
        }
      }
    ]
于 2021-05-05T03:43:39.553 回答