2015-05-07 5 views
0

У меня есть один индекс поиска elasticsearch, который содержит набор документов, у которых есть дата, которая является полем даты и времени, идентификатором учетной записи, другими различными полями и UUID для его идентификатора документа.Получение самого старого значения для каждого поля

Я хотел бы отправить запрос на поиск elasticsearch, который дает мне документ с самой старой датой срока действия для идентификатора учетной записи. Это запрос, который я бы послал, чтобы получить идентификаторы учетных записей, которые имеют 10 самых старых элементов в индексе. Этот запрос не позволяет мне просматривать результаты, и мне любопытно, знает ли кто-нибудь о том, как я напишу этот запрос (возможно, агрегацию топ-хитов), которая позволила бы мне просмотреть эти результаты?

{ 
    'query': { 
    'match_all': { 

    } 
    }, 
    'aggs': { 
    'account_id': { 
     'terms': { 
     'field': 'account_id', 
     'size': 10, 
     'order' : { "min_due_date" : "asc" } 
     }, 
     'aggs': { 
     'min_due_date': { 
      'min': { 
      'field': 'due_date' 
      } 
     } 
     } 
    } 
    } 
} 

Сегодня мы сохраняем самую старую дату на каждую учетную запись в отдельном индексе, который мы вручную должны обновлять. Было бы здорово, если бы я смог получить эластичный поиск, чтобы выполнить это с запросом в реальном времени.

Спасибо.

ответ

0

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

Итак, если вам нужны 11-го и 20-го попаданий, вам нужно определить верхние 20, а затем выбросить верхнюю часть 10. Для 21-го и 30-го попаданий вам нужно определить верхнюю 30, а затем выбросить вверх 20. Это продолжается до тех пор, пока вы не прекратите пейджинг.

Для поиска нормальных, которые не используют агрегации, вы можете выполнить эту проблему с помощью сканирования и прокрутки, но вы потеряете возможность сортировки. Это, безусловно, компромисс, но стоит сохранить здоровье вашего кластера от cost of deep paging.

С точки зрения скопления, стоимость пейджинга будет очень высокая. Агрегация - это дорогостоящая проблема (по шкале), поэтому разрешение пейджинга будет проблематичным. Поэтому подход к этой проблеме заключается в том, чтобы запросить соответствующий размер авансом - однократно принять бремя, а не нагрузку несколько раз. Единственное реальное изменение будет фоновой работой, проделанной для поддержания соответствующего размера осколков; обработка все равно выполняется независимо. Таким образом, реальная стоимость: добавленные сетевые накладные расходы (отправка через верхнюю часть N каждого осколка, чтобы определить фактический верхний N), плюс небольшая дополнительная обработка обработки добавленных результатов.

Смежные вопросы