如何合并来自多个 Elasticsearch 查询的排名?
Posted
技术标签:
【中文标题】如何合并来自多个 Elasticsearch 查询的排名?【英文标题】:How can I merge rankings from several Elasticsearch queries? 【发布时间】:2018-10-28 22:25:57 【问题描述】:我想合并查询 Elasticsearch 索引的单独字段获得的排名,以便获得“复合”排名。
作为一个(愚蠢的)“配对”示例,假设我想在包含他们最喜欢的音乐、食物、运动的人的索引中检索最佳匹配结果。
单独的查询可以是例如
"query": "match" : "music" : "indie classical metal"
这将产生我作为排名结果:
-
爱丽丝,2. 鲍勃,3. 查理;
"query": "match" : "foods" : "falafel strawberries coffee"
屈服
-
爱丽丝,2. 查理,3. 鲍勃;
和
"query": "match" : "sports" : "basketball ski"
屈服
-
查理,2. 爱丽丝,3. 鲍勃。
现在,我想根据上述排名获得一个“综合”排名,例如使用How to merge a collection of ordered preferences中列出的投票方式。
到目前为止,为了实现这些目标,我使用了复合查询的语法,例如
"query":
"bool":
"should": [
"match" : "music" : "indie classical metal" ,
"match" : "foods" : "falafel strawberries coffee" ,
"match" : "sports" : "basketball ski" ,
]
或
"query":
"dis_max":
"queries": [
"match" : "music" : "indie classical metal" ,
"match" : "foods" : "falafel strawberries coffee" ,
"match" : "sports" : "basketball ski" ,
]
但是(AFAIK)这些不符合我的要求(不是使用分数,而是排名)。我知道对排名进行后处理非常简单(例如,使用 elasticsearch-py,然后使用几行 Python 行),但是是否可以直接使用 Elasticsearch 查询来完成上述操作?
(额外问题:您能否提出替代策略来合并多个领域的排名,除了我可以尝试的bool
+should
和dis_max
?)
【问题讨论】:
【参考方案1】:看看Function Score Query - 它应该可以让你做你想做的事。但请注意,这可能会导致查询执行速度变慢。
【讨论】:
您可能应该根据上述 OP 的需求提供一个示例function_score
查询。以上是关于如何合并来自多个 Elasticsearch 查询的排名?的主要内容,如果未能解决你的问题,请参考以下文章
SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中