我有多个字段,例如。f1
、f2
、f3
,我想要针对每一个搜索单个词,并在任何字段匹配的地方返回聚合分数。我不想搜索每个领域的相同的条件,只搜索一个领域的自己的条件,例如。f1:t1
、f2:t2
、f3:t3
。
最初,我使用must
布尔查询和multi_match
,所有字段都连接为t1 t2 t3
,并搜索所有字段,但结果不是很好。使用dis_max
查询可以获得更好的结果,因为我能够按其各自的术语搜索各个字段,但如果例如在f1
中找到t1
,在f2
中找到t2
,则dis_max
的结果返回最高的结果分数。因此,如果我有3个文档,{ "f1": "foo", "f2": "foo" }
、{ "f1": "foo", "f2": "bar" }
、{ "f1": "foo", "f2": "baz" }
,并且我搜索f1:foo
和f2:ba
,我仍然可以在最近创建foo
的情况下,检索到f2
的第一条记录。我想说的是,f1
匹配foo
,因此有一个与此相关的分数,f2
匹配bar
,因此结果分数应该是f1.score + f2.score
,因为两者都匹配。
我发现我可以通过编程方式构建一个使用query_string
的查询,例如。(为简洁起见,仅限于两个字段)
GET /_search
{
"query": {
"query_string": {
"query": "(f1:foo OR f1.autocomplete:foo) OR (f2:ba OR f2.autocomplete:ba)"
}
}
}
但我需要增加对田地的提振,这是不允许的。我也可以使用dis_max
和一组queries
,但我真的不确定在这种情况下如何汇总分数。
用更好的话说,我试图搜索的是:如果我有人的数据,我想搜索名字和姓氏,而不是先按姓搜索,而不是按名搜索,与只返回其中之一的结果相比,名字和姓氏都匹配的结果应该更高。
有没有更好的/好的/适当的方法来实现这一点?我觉得我已经看了很多Query API,但还没有找到最好的东西。
2条答案
按热度按时间41ik7eoe1#
您可以使用简单的应该查询
一个文档匹配的子句越多,它的分数就越高。
oo7oh9g92#
无法编辑提供的答案,因此在此处发布从其他答案派生的解决方案。
这将使我得到符合我所有标准的结果。