在 Elasticsearch SimpleStringQuery 中要求短语匹配

Requiring Phrase Matches in Elasticsearch SimpleStringQuery

我正在使用 Elasticsearch 7.7 和 python elasticsearch_dsl 软件包版本 7.0.0 创建一个简单的搜索引擎。我正在使用 simple_query_string 搜索,因为我想启用最常见的搜索功能(布尔运算符、短语搜索)而不必自己解析查询。除了短语匹配功能外,这在很大程度上运行良好。

我想确保所有结果都包含短语匹配(如果查询中有的话)。例如。 google 的工作原理 - 如果我搜索 "green eggs" and ham,将不会有不包含“绿鸡蛋”的结果。

假设我的索引中有 3 个文档:

{
   "question":"I love my phrase",
   "background: "dont you"
},
{
   "question":"I love my phrase",
   "background: "and other terms"
},
{
   "question":"I have other terms",
   "background: "and more"
}

我现在看到的:

正如预期的那样,下面的查询仅 return 前两个文档,其中一个字段中包含“我的短语”。

    {
      'simple_query_string':
        {
          'query': '"my phrase"',
          'fields': ['question', 'background']
        }
     }

与我的预期相反,下面的查询将 return 所有 3 个结果,其中第 3 个得分高于第 1 个。

    {
      'simple_query_string':
        {
          'query': '"my phrase" other terms',
          'fields': ['question', 'background']
        }
     }

我如何更改我的查询,以便搜索“我的短语”其他字词不会 return 第三个文档,因为它不包含短语搜索,但第二个文档的得分高于第一个是因为它包含短语之外的其他搜索词?

我尝试过但没有奏效的事情:

谢谢

Contrary to what I expect, the below query will return all 3 results

默认情况下,查询中的单词与 OR 运算符组合:请参阅 simple_query_string documentationdefault_operator 参数的说明。您的第二个查询被解释为 "my phrase" OR other OR terms,因此它将 return 所有 3 个结果:每个文档至少包含术语 "my phrase"otherterms 之一.

How can I alter my query so that searching for '"my phrase" other terms' will not return the 3rd document because it does not contain the phrase search, but score the 2nd document higher than the 1st because it contains additional search terms outside of the phrase?

据我所知,simple_query_string 搜索无法做到这一点。你可以尝试使用query_string search, which have feature named boolean operators。使用该功能,您可以编写提供所需结果的查询:

{
  "query": {
    "query_string": {
      "query": "+\"my phrase\" other terms",
      "fields": ["question", "background"]
    }
  }
}