我编写了一个查询,以从我的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"
}
}
}
}
}
}
}
答案 0 :(得分:0)
你所试图做的是排序由另一个另一桶桶。您可以通过两种方式实现:
(a)通过bucket_sort聚合
(b)通过将order
参数用于术语聚合来引用另一个存储桶。
此聚合对其父级多存储桶聚合的存储桶进行排序。您可以指定将对存储桶进行排序的字段。使用此查询,您的案例查询将为:
{
"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
)所返回的latestOrder
相同的orderDate
。原因是我们已将orderDate
的命中顺序排序为最高,并将大小限制为一个,这等于最大值latestOrder
。
bucket_sort
对我们来说是一个排序字段,然后在order
聚合中用于对父存储桶(由术语聚合返回的存储桶)进行排序。
latestOrder
参数agg 我们使用与上述类似的方法。我们使用最大聚合order
,并在术语聚合的{
"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"
}
}
}
参数中引用它。因此查询将是:
{{1}}
查询中的更新:基于在post_filter中添加的注释中的讨论。