Elasticsearch:如何搜索,排序,限制结果然后再次排序?

时间:2016-10-11 00:52:04

标签: sorting elasticsearch

这不是关于多级排序的。

我需要首先按距离选择我的结果,限制为50,然后按价格排序。

select * 
from
(
select top 50 * from mytable order by distance asc)
)
order by price asc

基本上,第二种排序会抛弃内部排序的排序 - 但内部排序用于磨练前50种结果。

我在这类问题中看到的其他答案是关于二级排序,这不是我之后的。

BTW:我已经看过聚合 - 前N个结果,但我不确定我是否可以对聚合结果排序应用排序。还看了rescore,但我不知道在哪里放置我的'

3 个答案:

答案 0 :(得分:3)

热门点击聚合将允许您在主要查询排序(price)的案例distance中对单独的字段进行排序。 See the documentation here关于如何在顶部命中agg中指定排序。

它看起来有点像这样(假设distance是双重类型;如果它是地理位置类型,请使用Volodymyr Bilyachat提供的the documentation。)

{
   "sort":[
      {
         "distance":"asc"
      }
   ],
   "query":{
      "match_all":{}
   },
   "size":50,
   "aggs":{
      "top_price_hits":{
         "top_hits":{
            "sort":[
               {
                  "price":{
                     "order":"asc"
                  }
               }
            ],
            "size":50
         }
      }
   }
}

但是,如果您只想从主查询中获得50个结果,为什么不在应用程序客户端进行排序?这是一种更好的方法,因为使用顶级命中聚合进行二次排序是对其目的的轻微滥用。

应用内方法会更加健壮。

答案 1 :(得分:2)

+ 1'已接受的答案,但我想确保您了解搜索评分的方式,通常可以提供比传统排序更好的用户体验

根据您当前的策略,可以说:

  1. 距离很重要,相对而言(例如前50名最接近)但不是绝对值(例如必须在50mi之内)。

  2. 您只想显示50个结果。

  3. 您希望按价格(或按字母顺序)对这些结果进行排序。

  4. 但是,如果您发现自己试图概括搜索者最容易选择的结果,您可能会发现价格和距离(或其他功能)的功能更好地模拟了搜索者选择特定结果的真实可能性。

    E.g。假设你发现了

    • 为方便附近结果,用户需要支付更多费用
    • 用户将获得更远的距离以获得更大的折扣

    然后,您可以建模一个样本评分函数,该函数根据此关系生成结果排序。

    E.g。 1/price + 1/distance ...随着价格或距离的减少,会产生更高的分数。

    可以推广到P * 1/price + 1/distance,其中P表示调整系数,表示价格与距离的相对重要性。

    使用此模型,您可以编写一个function score query,它会输出具有您用户价格和距离的最佳组合的有序结果。

答案 2 :(得分:0)

我认为最好在查询中使用 size:50 属性选择前50名,然后ordering by distance,然后按价格在应用中对结果进行排序。