在Elasticsearch SimpleStringQuery中要求短语匹配



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

如果查询中有短语匹配,我希望确保所有结果都包含短语匹配。例如,谷歌的工作原理-如果我搜索"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个结果,第三个结果的得分高于第一个。

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

我如何更改我的查询,以便搜索";我的短语";其他术语'不会返回第三个文档,因为它不包含短语搜索,但第二个文档的得分高于第一个文档,原因是它包含短语之外的其他搜索术语?

我尝试过但没有成功的事情:

  • 'query': '"my phrase" AND (other terms)'
  • 'query': '"my phrase" AND other terms'

谢谢

与我预期的相反,下面的查询将返回所有3个结果

查询中的默认单词与OR运算符组合:请参阅simple_query_string文档中对default_operator参数的描述。您的第二个查询被解释为"my phrase" OR other OR terms,因此它将返回所有3个结果:每个文档至少包含术语"my phrase"otherterms中的一个。

我如何更改我的查询,以便搜索";我的短语";其他术语'不会返回第三个文档,因为它不包含短语搜索,但第二个文档的得分高于第一个文档,原因是它包含短语之外的其他搜索术语?

AFAIK,这在simple_query_string搜索中是不可能的。您可以尝试使用query_string搜索,它具有命名为布尔运算符的功能。使用该功能,您可以编写提供所需结果的查询:

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

最新更新