我正在使用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"
、other
和terms
中的一个。
我如何更改我的查询,以便搜索";我的短语";其他术语'不会返回第三个文档,因为它不包含短语搜索,但第二个文档的得分高于第一个文档,原因是它包含短语之外的其他搜索术语?
AFAIK,这在simple_query_string
搜索中是不可能的。您可以尝试使用query_string搜索,它具有命名为布尔运算符的功能。使用该功能,您可以编写提供所需结果的查询:
{
"query": {
"query_string": {
"query": "+"my phrase" other terms",
"fields": ["question", "background"]
}
}
}