这不是关于多级排序的。
我需要首先按距离选择我的结果,限制为50,然后按价格排序。
select *
from
(
select top 50 * from mytable order by distance asc)
)
order by price asc
基本上,第二种排序会抛弃内部排序的排序 - 但内部排序用于磨练前50种结果。
我在这类问题中看到的其他答案是关于二级排序,这不是我之后的。
BTW:我已经看过聚合 - 前N个结果,但我不确定我是否可以对聚合结果排序应用排序。还看了rescore
,但我不知道在哪里放置我的'
答案 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'已接受的答案,但我想确保您了解搜索评分的方式,通常可以提供比传统排序更好的用户体验
根据您当前的策略,可以说:
距离很重要,相对而言(例如前50名最接近)但不是绝对值(例如必须在50mi之内)。
您只想显示50个结果。
您希望按价格(或按字母顺序)对这些结果进行排序。
但是,如果您发现自己试图概括搜索者最容易选择的结果,您可能会发现价格和距离(或其他功能)的功能更好地模拟了搜索者选择特定结果的真实可能性。
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,然后按价格在应用中对结果进行排序。