TL; DR: Используя внутреннюю агрегацию с несколькими ведрами (top_hits
с size: 1
) внутри внешней агрегации с несколькими ведрами, можно сортировать сегменты внешних агрегация по данным во внутренних сегментах?
У меня есть следующие сопоставления индексов
{
"parent": {
"properties": {
"children": {
"type": "nested",
"properties": {
"child_id": { "type": "keyword" }
}
}
}
}
}
, и каждый дочерний элемент (в данных) также имеет свойства last_modified: Date
и other_property: String
.
Мне нужно получить список детей (всех родителей, но без родителей), но только одного с последним last_modified
на каждого child_id
. Затем мне нужно отсортировать и разбить на страницы эти результаты, чтобы получить управляемые объемы данных.
Я могу получить данные и разбить их на страницы с помощью комбинации nested
, terms
, top_hits
, и bucket_sort
агрегации (а также получить общее количество с cardinality
)
{
"query": {
"match_all": {}
},
"size": 0,
"aggs": {
"children": {
"nested": {
"path": "children"
},
"aggs": {
"totalCount": {
"cardinality": {
"field": "children.child_id"
}
},
"oneChildPerId": {
"terms": {
"field": "children.child_id",
"order": { "_term": "asc" },
"size": 1000000
},
"aggs": {
"lastModified": {
"top_hits": {
"_source": [
"children.other_property"
],
"sort": {
"children.last_modified": {
"order": "desc"
}
},
"size": 1
}
},
"paginate": {
"bucket_sort": {
"from": 36,
"size": 3
}
}
}
}
}
}
}
}
, но после более чем 1055 * дня изучения документов и экспериментов, я, кажется, не ближе к выяснить, как отсортировать сегменты моего oneChildPerId
агрегации по other_property
этого единственного дочернего элемента, полученного с помощью lastModified
агрегации.
Есть ли способ сортировки агрегации с несколькими сегментами по результатам вложенного объединения нескольких сегментов?
Что я пробовал:
- Я думал, что мог бы использовать для этого тоже
bucket_sort
, но по-видимому, его sort
можно использовать только с путями, содержащими другие агрегаты с одним сегментом и заканчивающимися мети c единицей. - Я пытался найти способ каким-то образом преобразовать мультипоток 1-результата ведро с
lastModified
в одно ведро, но не нашло ни одного.
Я использую ElasticSearch 6.8.6 (bucket_sort
и аналогичные инструменты не были доступны в ES 5.x и старше).