【问题标题】:Elasticsearch: How to search, sort, limit the results then sort again?Elasticsearch:如何搜索、排序、限制结果然后再次排序?
【发布时间】:2017-02-19 12:02:42
【问题描述】:

这与多级排序无关。

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

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

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

我在这类问题上看到的其他答案着眼于二级排序,这不是我所追求的。

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

【问题讨论】:

    标签: sorting elasticsearch


    【解决方案1】:

    热门点击聚合将允许您对单独的字段进行排序,在您的情况下,price 来自主查询排序(在 distance 上)。 See the documentation here 了解如何在 top hits 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 个结果,为什么不在应用程序客户端进行排序呢?这将是一种更好的方法,因为将热门点击聚合用于二级排序是对其目的的轻微滥用。

    应用内方法会更健壮。

    【讨论】:

    • 看起来我需要在应用程序端进行“重新排序”。我不想要这个,因为它实际上是按价格排序,然后是 GeoDistance,然后是按字母排序(示例中的“价格”只是为了示例)——这也是我首先进入 Elasticsearch 的部分原因.不过感谢您的回答 - 这让我放心,我的想法并不遥远。
    • 在这些类型的排序上,关系数据库比 Elasticsearch 好得多。也就是说,如果您在应用程序中一次只需要 50 个结果(或类似的少量),那么在要求数据存储进行主要排序和限制之后,您喜欢的排序可能始终是最好的方法。
    【解决方案2】:

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

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

    1. 距离很重要,相对而言(例如最接近的前 50 个),但不是绝对值(例如必须在 50 英里以内)。

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

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


    但是,如果您发现自己试图概括搜索者最可能选择哪个结果,您可能会发现价格和距离(或其他特征)的函数 更好地模拟搜索者选择特定结果的真实世界可能性。

    例如假设你发现了

    • 用户会为了附近结果的便利而支付更多费用
    • 用户将旅行更远的距离以获得更大的折扣

    然后您可以建模一个示例评分函数,该函数根据这种关系生成结果排序。

    例如1/price + 1/distance ...随着价格或距离的降低,这将产生更高的分数。

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


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

    【讨论】:

    • 这是我将在项目的下一阶段涉及的内容。不幸的是,对于当前的问题,我现在需要返回过滤字段的嵌套元素,以便我可以在应用程序中进行排序。但我确定这是另一个 SO 问题......
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多