【问题标题】:Sort in Elastic Search take top N records, sort again在 Elastic Search 中排序 取前 N 条记录,再次排序
【发布时间】:2019-02-25 19:32:51
【问题描述】:

是否可以按字段 A 对所有文档进行排序,取前 N 条记录,然后在 ElasticSearch 中按字段 B 再次对所有记录进行排序?

到目前为止我尝试过的内容如下,但它没有按 fieldB 排序

{  
    "query":{  
     "bool":{  
     "must":[  
        {  
           "match_all":{  

           }
        }
     ],
     "must_not":[  

     ],
     "should":[  

     ]
  }
},
"from":0,
"size":20,
"sort":[  
{
  "FieldA": {
    "missing": "_last",
    "order": "desc"
  }
}, 
{
  "FieldB": {
    "missing": "_last",
    "order": "desc"
  }
}
],
 "aggs":{  

 }
}

等效的 SQL 将是

SELECT * FROM (SELECT TOP 250 FROM TABLE ORDER BY FieldA) ORDER BY FieldB 

在 Elasticsearch 5.3 上运行

【问题讨论】:

  • 看起来搜索不错,排序应该按预期工作。你能举一个未排序响应的例子吗?
  • 上述查询首先对FieldA上的文档进行排序,如果有多个相同值的记录,它将在FieldB上排序。我想基本上有类似 SELECT * FROM (SELECT TOP 250 FROM TABLE ORDER BY FieldA) ORDER BY FieldB 之类的东西,所以第二个 FieldB 是一个完整的重新排序。
  • 所以如果我做对了,最初按 FieldA 排序的唯一原因是选择数据的子集。该子集的最终结果最终应按 FieldB 排序,对吗?
  • 还有什么是FieldAFieldB的典型值?
  • 正确,第二次排序是基于第一次排序的结果。 FieldA 是整数,FieldB 是浮点数。

标签: elasticsearch


【解决方案1】:

我从这个question 找到了这个解决方案。

基本上我们想对表格进行排序,得到前 N 个结果,然后再对另一列进行排序。查询也将与此类似。

我们会先按照fieldA排序,取前50名再传这个按照fieldB排序。

{
   "sort":[
      {
         "FieldA": {
           "missing": "_last",
           "order": "desc"
         }
      }
   ],
   "query":{
      "match_all":{}
   },
   "size":50,
   "aggs":{
      "top_fieldB_hits":{
         "top_hits":{
            "sort":[
               {
                  "FieldB": {
                    "missing": "_last",
                    "order": "desc"
                   }
               }
            ],
            "size":50
         }
      }
   }
}

【讨论】:

  • 请注意,top_hits 聚合是在所有文档上执行的,而不仅仅是按 FieldA 排序的前 50 个文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多