在Elastic Search中排序,获取前N条记录,然后再次排序

时间:2019-02-13 23:54:40

标签: elasticsearch

是否可以在ElasticSearch中按字段A排序前N个记录对所有文档进行排序,然后再次按字段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上运行

1 个答案:

答案 0 :(得分:0)

我从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
         }
      }
   }
}