Как мне отсортировать верхний хит во вложенном агрегате по полю в корневом документе?

#elasticsearch #aggregation #elasticsearch-aggregation

#elasticsearch #агрегирование #elasticsearch-агрегация

Вопрос:

Я выполняю агрегацию верхнего хита во вложенной агрегации. Я хочу упорядочить верхние хиты по полю метки времени в корневом документе, чтобы получить самую последнюю версию вложенного документа (который может быть проиндексирован в несколько корневых документов). Хотя синтаксис, кажется, позволяет мне это сделать, извлеченные ключи сортировки кажутся «ненужными»; это одно и то же огромное число для каждого документа. (Ниже приведен лишь фрагмент гораздо более сложной агрегации — в противном случае такой подход может не иметь смысла — но в нем суть моей проблемы.)

 {
   "size": 0,
   "aggs": {
      "nested_doc": {
         "nested": {
            "path": "nested_doc"
         },
         "aggs": {
            "most_recent": {
               "top_hits": {
                  "sort": "_index_time"
               }
            }
         }
      }
   }
}
  

В моих результатах ключ сортировки не соответствует ни одному такому «_index_time», и изменение порядка сортировки не имеет никакого эффекта. «_index_time» объявляется целым числом в корневом документе. Если я изменяю «_index_time» в запросе на какую-то бессмысленную строку, запрос выдает ошибку, поэтому я знаю, что он имеет смысл в том, что я спрашиваю, но он не выполняет сортировку — или, по крайней мере, не получает нужные данные для сортировки.

Как мне правильно отсортировать вложенные агрегаты по корневым свойствам?

В качестве альтернативы я попытался добавить copy_to: ‘nested_doc._index_time’ в объявление ‘_index_time’, и хотя это позволило мне указать ‘nested_doc._index_time’ в качестве ключа сортировки, это все равно привело к бессмысленным ключам сортировки. Поле просто неправильно определено?

     _index_time: { type: 'integer'},
  

Ответ №1:

Я столкнулся с той же проблемой, затем я нашел одно решение во вложенной агрегации. В этом случае мы можем добавить параллельную агрегацию с включенной максимальной агрегацией index_time . А затем отсортируйте его на основе добавленной вами максимальной агрегации. Вам просто нужно настроить order оператор в соответствии с вашей агрегацией на первом уровне.

Пожалуйста, ознакомьтесь с приведенным ниже запросом:

 {
   "size": 0,
   "aggs": {
      "nested_doc": {
         "nested": {
            "path": "nested_doc"
         },
         "order": {
            "max_date": "asc"
         }
         "aggs": {
            "most_recent": {
               "top_hits": {
                  "sort": "_index_time"
               }
            },
            "max_date": {
                 "max": {
                    "field": "_index_time"
                 }
             }

         }
      }
   }
}
  

Надеюсь, это решит вашу проблему.