我正在使用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"
,other
和terms
之一。
AFAIK,这是simple_query_string
搜索无法实现的。您可以尝试使用query_string搜索,该搜索具有名为boolean operators的功能。使用该功能,您可以编写查询以提供所需的结果:
{
"query": {
"query_string": {
"query": "+\"my phrase\" other terms",
"fields": ["question", "background"]
}
}
}