如何合并来自多个Elasticsearch查询的排名?

Dav*_*cco 8 python elasticsearch

我想合并从查询Elasticsearch索引的单独字段获得的排名,以获得"复合"排名.

作为一个(愚蠢的)"配对"示例,假设我想要在包含他们喜欢的音乐,食物,体育的人的索引上检索最佳匹配结果.

单独的查询可以是例如

"query": { "match" : { "music" : "indie classical metal" } }
Run Code Online (Sandbox Code Playgroud)

这将使我成为排名结果:

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

"query": { "match" : { "foods" : "falafel strawberries coffee" } }
Run Code Online (Sandbox Code Playgroud)

生产

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

"query": { "match" : { "sports" : "basketball ski" } }
Run Code Online (Sandbox Code Playgroud)

生产

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

现在,我想基于上面的排名获得"聚合"排名,例如使用如何合并有序偏好集合中列出的投票方法.

到目前为止,为了实现这些方面的某些内容,我使用了复合查询的语法,例如

"query": {
   "bool": {
        "should": [
                { "match" : { "music" : "indie classical metal" } },
                { "match" : { "foods" : "falafel strawberries coffee" } },
                { "match" : { "sports" : "basketball ski" } },
        ]
    }
 }
Run Code Online (Sandbox Code Playgroud)

要么

"query": {
   "dis_max": {
        "queries": [
                { "match" : { "music" : "indie classical metal" } },
                { "match" : { "foods" : "falafel strawberries coffee" } },
                { "match" : { "sports" : "basketball ski" } },
        ]
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是(AFAIK)这些并没有做我想要的(不是使用分数,而是排名).我理解对排名进行后期处理是相当简单的(例如使用elasticsearch-py然后使用一些Python行),但是可以使用Elasticsearch查询直接执行上述操作吗?

(奖金问题:你能否提出其他策略来合并来自多个领域的排名,超出bool+ should并且dis_max我可以尝试?)

小智 -1

看看Function Score Query - 它应该允许您执行您\xe2\x80\x99 正在寻找的操作。但请注意,这可能会导致查询执行速度变慢。

\n

  • 您可能应该根据上述 OP 的需求提供一个示例“function_score”查询。 (5认同)