我正在使用Elasticsearch 7.7和python elasticsearch_dsl软件包版本7.0.0创建一个简单的搜索引擎。我正在使用simple_query_string搜索,因为我想启用最常见的搜索功能( bool(boolean) 运算符,短语搜索),而不必自己解析查询。除词组匹配功能外,这在很大程度上运行良好。
如果查询中有一个词组匹配,我想确保所有结果都包括一个词组匹配。例如。 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"
}
我现在看到的是:
不出所料,以下查询仅返回前两个文档,其中两个字段之一中包含“我的短语”。
    {
      'simple_query_string':
        {
          'query': '"my phrase"',
          'fields': ['question', 'background']
        }
     }

与我的预期相反,以下查询将返回所有3个结果,第3个得分高于第1个。
    {
      'simple_query_string':
        {
          'query': '"my phrase" other terms',
          'fields': ['question', 'background']
        }
     }

我该如何更改查询,以使搜索“其他词条”不会返回第3个文档,因为它不包含词组搜索,但对第2个文档的评分要高于第1个文档,因为它包含第三个文档之外的其他搜索词词组?
我尝试过的东西没有用:
  • 'query': '"my phrase" AND (other terms)'
  • 'query': '"my phrase" AND other terms'

  • 谢谢

    最佳答案


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

    AFAIK,这是simple_query_string搜索无法实现的。您可以尝试使用query_string搜索,该搜索具有名为boolean operators的功能。使用该功能,您可以编写查询以提供所需的结果:

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

    10-07 15:16