Агрегирование терминов упорядочения Elasticsearch после поля в верхнем совпадении
Я хотел бы заказать сегменты из агрегации терминов на основе свойства, которым обладает первый элемент в агрегации топ-хитов.
Мой лучший запрос выглядит так (с синтаксическими ошибками):
{
"aggregations": {
"toBeOrdered": {
"terms": {
"field": "parent_uuid",
"size": 1000000,
"order": {
"topAnswer._source.id": "asc"
}
},
"aggregations": {
"topAnswer": {
"top_hits": {
"size": 1
}
}
}
}
}
}
Кто-нибудь знает, как этого добиться?
Пример:
{
"a":1,
"b":2,
"id":4
}
{
"a":1,
"b":3,
"id":1
}
{
"a":2,
"b":4,
"id":3
}
Группировка по "a" и упорядочение сегментов по "id" (desc) и сортировка лучших совпадений по "b" (desc) даст:
{2:{
"a":2,
"b":4,
"id":3
},1:{
"a":1,
"b":3,
"id":1
}}
1 ответ
Вы можете сделать это с помощью следующего запроса. Идея состоит в том, чтобы показать для каждого parent_uuid
ведро первый топ хит с минимальным id
значение и сортировать parent_uuid
ведра по наименьшему id
значение, а с помощью min
суб-агрегации.
{
"aggregations": {
"toBeOrdered": {
"terms": {
"field": "parent_uuid",
"size": 1000000,
"order": {
"topSort": "desc"
}
},
"aggregations": {
"topAnswer": {
"top_hits": {
"size": 1,
"sort": {
"b": "desc"
}
}
},
"topSort": {
"max": {
"field": "id"
}
}
}
}
}
}
Попробуйте и сообщите, если это сработает для вас.