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

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

{
   "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'},

person Joe Hasbani    schedule 17.10.2016    source источник


Ответы (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"
                 }
             }

         }
      }
   }
}

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

person Aman Garg    schedule 30.08.2018