【问题标题】:How can I merge rankings from several Elasticsearch queries?如何合并来自多个 Elasticsearch 查询的排名?
【发布时间】:2018-10-28 22:25:57
【问题描述】:

我想合并查询 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. 鲍勃。

现在,我想根据上述排名获得一个“综合”排名,例如使用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?)

【问题讨论】:

    标签: python elasticsearch


    【解决方案1】:

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

    【讨论】:

    • 您可能应该根据上述 OP 的需求提供一个示例 function_score 查询。
    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2012-04-06
    • 2016-05-18
    相关资源
    最近更新 更多