当前位置: 首页 > 面试题库 >

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

隆安然
2023-03-14
问题内容

这与多级排序无关。

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

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

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

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

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


问题答案:

热门匹配汇总可让您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个结果,为什么不只在应用程序客户端排序呢?这将是一种更好的方法,因为将热门匹配用作次要排序是对其目的的轻微滥用。

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



 类似资料:
  • 问题内容: 我想根据特定字段对结果进行排序,然后应用限制过滤器。 一个简单的常见示例是一个SQL查询,例如返回的排序结果限制为100。 我在Elasticsearch中尝试了相同的方法。但是,这没有发生。它首先应用限制,然后进行排序,这给了我不希望的结果。谁能指出我做错了什么?这是我当前正在使用的查询。 问题答案: 限制过滤器首先在每个分片上工作,然后在一个节点上合并结果。如果您有多个分片,那么可

  • 问题内容: 假设我将这样的文档存储在ElasticSearch中: 假设我使用location = CA进行搜索,如何根据“标签”中项目的数量对结果进行排序? 我想在首页中列出标签数量最多的人。 问题答案: 您可以为包含标签数量的其他字段建立索引,然后在其上轻松地对结果进行排序。否则,如果您愿意在查询时付出一点性能成本,那么有个不错的解决方案不需要重新索引数据:您可以根据如下脚本进行排序: 从基于

  • 我已经在按\u score desc排序的查询部分中获得了所需的查询结果。现在我需要提取每个文档的3个字段。我想实现如下目标: 我刚刚试过: 1)使用折叠删除重复的值 但问题是它只会保留filed1的不同值,而忽略field 2和field 3的值。例如,我们有2条记录,如下所示: 使用此方法,我们只能获得一条记录,因为它们具有相同的field1值。我想要这三个字段的不同组合值。我们可以使用int

  • 我需要对以搜索词开头的搜索结果进行优先级排序。我用了“匹配短语前缀”。我用了“匹配短语前缀”。但它不起作用。 细节: > 质疑 结果

  • 问题内容: 使用时,我找不到任何排序结果的方法 就我而言,我想按.Ports订购 如何订购结果? 问题答案: 列出容器 格式 概要 显示容器及其命令 在表格中显示带有标签的容器 在表中显示带有节点标签的容器

  • 问题内容: 用Python的方式搜索或操作排序序列是什么? 问题答案: 是标准库的一部分-您正在寻找这种东西吗?