我写了一个查询,以便从我的ES获得每个ID最近的记录。但这种查询的结果只做内部排序和选择最新的记录。现在我需要,我得按日期进行排序的结果。
这是我的查询:
{
"size":0,
"query":{
"bool":{
"must":[
{
"match":{
"base":"XYZ"
}
},
{
"match":{
"Type":"low"
}
}
]
}
},
"aggs":{
"sources":{
"terms":{
"field":"Id"
},
"aggs":{
"latest":{
"top_hits":{
"size":1,
"_source":{
"includes":[
"base",
"Type"
]
},
"sort":{
"orderDate":"desc"
}
}
}
}
}
}
}
你所要做的是另一个另一桶排序桶。您可以通过两种方式实现:
(a)在聚合bucket_sort
(b)通过利用order
PARAM条款聚合引用到另一桶。
这种聚合排序其父多斗聚集桶。您可以根据指定的字段(S)上的桶进行排序。用这种方法,你的情况下,查询将是:
{
"query": {
"bool": {
"must": [
{
"match": {
"base": "XYZ"
}
},
{
"match": {
"Type": "low"
}
}
]
}
},
"aggs": {
"source": {
"terms": {
"field": "id"
},
"aggs": {
"latest": {
"top_hits": {
"size": 1,
"_source": {
"includes": [
"base",
"Type"
]
},
"sort": {
"orderDate": "desc"
}
}
},
"latestOrder": {
"max": {
"field": "orderDate"
}
},
"bucket_sort_order": {
"bucket_sort": {
"sort": {
"latestOrder": {
"order": "desc"
}
}
}
}
}
}
},
"post_filter": {
"term": {
"status": "yes"
}
}
}
在上面的查询我使用了命名为latestOrder
一个最大的聚集。这种聚合为我们提供了最新的orderDate
值。如果我们看一下作为最高命中聚合,它返回的文件将具有相同的orderDate
由最大aggeration即latestOrder
返回。其原因是,我们已经下令顶部由orderDate
desc中命中和限制大小之一,这相当于最大orderDate
。
latestOrder
可以作为我们的一个排序字段,然后在bucket_sort
聚集用于这是由项聚集返回的桶父桶排序。
order
param in terms agg我们使用类似的方法同上。我们用最大的聚集latestOrder
和术语聚集order
PARAM引用它。所以查询将是:
{
"query": {
"bool": {
"must": [
{
"match": {
"base": "XYZ"
}
},
{
"match": {
"Type": "low"
}
}
]
}
},
"aggs": {
"source": {
"terms": {
"field": "id",
"order": {
"latestOrder": "desc"
}
},
"aggs": {
"latest": {
"top_hits": {
"size": 1,
"_source": {
"includes": [
"base",
"Type",
"orderDate"
]
},
"sort": {
"orderDate": "desc"
}
}
},
"latestOrder": {
"max": {
"field":"orderDate"
}
}
}
}
},
"post_filter": {
"term": {
"status": "yes"
}
}
}
更新查询:基于对意见的讨论加入post_filter。