如何合并来自多个 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+shoulddis_max?)

【问题讨论】:

【参考方案1】:

看看Function Score Query - 它应该可以让你做你想做的事。但请注意,这可能会导致查询执行速度变慢。

【讨论】:

您可能应该根据上述 OP 的需求提供一个示例 function_score 查询。

以上是关于如何合并来自多个 Elasticsearch 查询的排名?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 2012 将来自多个表的多个查询与连接和计数合并到一个表中

如何合并两个或多个具有不同 where 条件的查询?我必须重用在第一个代码中使用的代码

Elasticsearch查询类型

Elasticsearch 多字段搜索

MongoDB:将来自多个集合的数据合并为一个..如何?

如果它们共享任何键值对,如何合并来自不同列表的多个字典?