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

时间:2018-05-18 13:04:34

标签: python elasticsearch

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

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

单独的查询可以是例如。

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

这将使我成为排名结果:

  1. Alice,2。Bob,3。Charlie;
  2. "query": { "match" : { "foods" : "falafel strawberries coffee" } }
    

    屈服

    1. Alice,2。Charlie,3。Bob;
    2. "query": { "match" : { "sports" : "basketball ski" } }
      

      屈服

      1. Charlie,2。Alice,3。Bob。
      2. 现在,我希望根据上述排名获得“综合”排名,例如使用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 个答案:

答案 0 :(得分:0)

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