Как вычислить фасеты/агрегации для первых n документов с нумерацией страниц в Elasticsearch?

Предположим, у меня есть индекс автомобилей на стоянке у дилера. Каждый документ выглядит следующим образом:

{
  color: 'red',
  model_year: '2015',
  date_added: '2015-07-20'
}

Предположим, у меня есть миллион автомобилей.

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

Я мог бы просто использовать from и size для разбиения результатов на страницы до фиксированного предела в 1000, но при этом итоги и аспекты по model_year и color (т.е. агрегации), которые я получаю от Elasticsearch, неверны - они закончились. весь совпадающий набор.

Как ограничить поиск 1000 последних добавленных документов для разбиения на страницы и агрегирования?


person Michael Haren    schedule 21.07.2015    source источник
comment
Можете ли вы показать запрос, который вы используете?   -  person Val    schedule 21.07.2015
comment
@Val- часть запроса не так интересна и может даже соответствовать всем. например { "sort": { "date_added": { "order": "desc" } } }   -  person Michael Haren    schedule 21.07.2015
comment
Разбивка на страницы невозможна для результата агрегирования.   -  person Andrei Stefan    schedule 21.07.2015
comment
@AndreiStefan, учитывая мой относительно небольшой набор, может быть, мне всегда следует извлекать 200 документов и выполнять разбиение на страницы вне Elasticsearch? Тогда, может быть, все, что мне нужно, — это способ охвата агрегации N лучших документов (тогда from не требуется) — возможно ли это?   -  person Michael Haren    schedule 21.07.2015
comment
Является агрегацией top_hits функция, которую вы ищете?   -  person Andrei Stefan    schedule 21.07.2015
comment
Хм, теперь я не уверен. Ограничивает ли top_hits отдельные сегменты, а не набор документов, для которых они собирают агрегированные данные?   -  person Michael Haren    schedule 23.07.2015


Ответы (1)


Как вы, вероятно, видели в документации, агрегирование выполняется в области действия самого запроса. Если запрос не задан, агрегирование выполняется по match_all списку результатов. Даже если вы будете использовать size на уровне запроса, это все равно не даст вам того, что вам нужно, потому что size — это просто способ возврата набора документов из всех документов, соответствующих запросу. Агрегации работают с тем, что соответствует запросу.

Этот запрос функции не нов, и некоторое время назад его уже запрашивали.

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

В ES 2.0 также есть объединение выборки, которое работает более или менее так же, как работает terminate_after, но здесь учитывается количество рассматриваемых документов из каждого сегмента. Если вы просто отсортируете после date_added, а запрос будет просто match_all, все документы будут иметь одинаковую оценку, и он будет возвращать нерелевантный набор документов.

В заключение:

  • для этого нет хорошего решения, есть обходные пути с количеством документов на шард. Итак, если вы хотите 1000 автомобилей, то нужно взять это число разделить на количество первичных шардов, использовать в агрегации sampler или с terminate_after и получить комплект документов

  • я предлагаю вместо этого использовать запрос для ограничения количества документов (автомобилей) по другому критерию. Например, показать (и агрегировать) автомобили за последние 30 дней или что-то подобное. Это означает, что критерии должны быть включены в сам запрос, чтобы результирующий набор документов был тем, который вы хотите агрегировать. Применять агрегации к определенному количеству документов после их сортировки непросто.

person Andrei Stefan    schedule 10.09.2015