一尘不染

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

elasticsearch

这与多级排序无关。

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

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

本质上,第二种排序放弃了内部排序的顺序-但是内部排序用于磨练前50个结果。

对于此类问题,我看到的其他答案是第二级排序,这不是我想要的。

顺便说一句:我看过聚合-前N个结果,但不确定是否可以对聚合结果排序应用排序。也看过了rescore,但我不知道将“分类”放在哪里


阅读 437

收藏
2020-06-22

共1个答案

一尘不染

热门匹配汇总可让您price根据主查询的排序方式(在上distance)对单独的字段进行排序。请参阅此处的文档,了解如何在热门匹配agg中指定排序。

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

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

但是,如果主要查询只需要50个结果,为什么不只在应用程序客户端排序呢?这将是一种更好的方法,因为将热门匹配用作次要排序是对其目的的轻微滥用。

应用程序内方法将更强大。

2020-06-22