首页 > 解决方案 > 如何合并来自多个 Elasticsearch 查询的排名?

问题描述

我想合并通过查询 Elasticsearch 索引的单独字段获得的排名,以获得“复合”排名。

作为一个(愚蠢的)“配对”示例,假设我想在包含他们最喜欢的音乐、食物、运动的人的索引上检索最佳匹配结果。

单独的查询可以是例如

"query": { "match" : { "music" : "indie classical metal" } }

这将产生我作为排名结果:

  1. 爱丽丝,2. 鲍勃,3. 查理;

"query": { "match" : { "foods" : "falafel strawberries coffee" } }

屈服

  1. 爱丽丝,2. 查理,3. 鲍勃;

"query": { "match" : { "sports" : "basketball ski" } }

屈服

  1. 查理,2. 爱丽丝,3. 鲍勃。

现在,我想根据上面的排名获得一个“综合”排名,例如使用如何合并有序偏好集合中列出的投票方法。

到目前为止,为了实现这些目标,我使用了复合查询的语法,例如

"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我可以尝试一下?)

标签: pythonelasticsearch

解决方案


看看Function Score Query - 它应该允许你做你正在寻找的东西。但请注意,这可能会导致查询执行速度变慢。


推荐阅读