То, что вы пытаетесь сделать, это сортировать ведра по другому другому ведру.Это можно сделать двумя способами:
(a) bucket_sort агрегация
(b) с помощью параметра order
для агрегирования терминов, ссылающихся на другой сегмент.
(a) агрегация bucket_sort
Эта агрегация сортирует сегменты своей родительской агрегации с несколькими сегментами.Вы можете указать поля, на основании которых будут сортироваться сегменты.Используя это, запрос для вашего случая будет:
{
"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
в деск и ограничили размер до единицы, что эквивалентно max orderDate
.
latestOrder
работает как поле сортировки для нас, которое затем используетсяв агрегации bucket_sort
для сортировки родительских сегментов, которые представляют собой сегменты, возвращаемые агрегацией терминов.
(b) order
param в терминах agg
Мы используем тот же подход, что и выше.Мы используем максимальное агрегирование latestOrder
и указываем его в 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"
}
}
}
ОБНОВЛЕНИЕ в запросах : На основе обсуждения в комментариях добавлен post_filter.