2016-09-26 14 views
1

Я запускаю фильтр elasticsearch с большим №. (~ 10 миллионов хитов) результатов. Мой from+size max - это по умолчанию (10 000 хитов). Я хотел бы агрегировать на основе поля и возвращать все хиты для фильтра во всех ведрах (а не только числа).ES: Ведро agg + top_hits + прокрутка? Как вернуть все образы (больше, чем `size + from` max) в ведрах?

Я знаю, что могу использовать top_hits, чтобы получить фактические документы в каждом ковше (ElasticSearch: retriving documents belonging to buckets), но я думаю, мне нужно прокрутить, чтобы получить их все (чтобы получить больше, чем первые 10000 хитов). Могу ли я прокручивать и агрегировать данные? Ошибка apiapi, когда я запускаю ее с агрегацией.

В настоящее время у меня есть два решения, как кажется, не так уж велика:

  1. запустить несколько запросов фильтра, скажем, 1 для каждого сегмента (а потом мне не нужно использовать агрегацию + top_hits команду). (слишком медленно для моего приложения)

  2. Запустите 1 большой запрос фильтра и не суммируйте его, но используйте прокрутку api, чтобы получить все образы. Затем я поместил их в соответствующие ведра здесь, на моем хосте. (Хорошо, но кажется, что ES создан для объединения их в ведра для меня и имеет больше ресурсов, чтобы сделать эту работу)

Существуют ли более эффективные способы борьбы с этим?

Это кажется связано с этим: (Paging elasticsearch aggregation results), хотя прокрутки апи не упоминается (если это не то, что они означают пейджинга?)

+0

У вас есть более 10 000 документов в каждом ведре? Или у вас есть более 10 000 ведер и вы хотите просмотреть эти ведра? – jay

+0

Некоторые ведра имеют более 10 000 посещений. Прямо сейчас я смотрю ~ 500 ведер. Мои общие хиты похожи на 16 миллионов, – travelingbones

ответ

1

Я считаю, что ваш случай использования не поддерживается. Агрегации специально «выкидывают» другую информацию в документах. Top hits предназначен только для возврата the most relevant показов в каждом ковше, соответствующих вашему запросу. Это скорее функция скоринга, чем функция поиска документа, то есть верхние хиты agg не предназначены для возврата всех документов в ведро.

Если вам все же нужны все документы, почему бы вам не объединить результаты самостоятельно? Это ваш вариант №2, и мне кажется, что это лучший вариант.

SO post, на который вы ссылаетесь, описывает обходной путь для подкачки в агрегировании с использованием excludevalue filter in terms aggregations. Он не использует прокрутку api. Я также не думаю, что это вам поможет.

И, наконец, коэффициенты эластичности поиска часто имеют errors due to shard sizing. Если вам все равно нужны документы, вы можете получить полностью точные агрегаты, выполнив bucketing в своем приложении - вам придется посещать каждый документ, который может быть медленнее, чем то, что может сделать ES, но вы также получаете другой результат.

Если у вас есть более подробная информация о вашем прецеденте, возможно, один из нас может дать лучший совет. Например, зачем вам нужны все документы, а также количество ведра?

+0

Моя цель - объединить документы в бункеры, а затем построить векторы признаков из всех полей. Итак, мне нужны все документы. Некоторые из возможностей, которые я мог бы получить из подсчета веток ES, но большинство из них более сложные и требуют специального кода после того, как у меня есть события. Я использую ES для сортировки по возвращении, что является преимуществом. Я буду придерживаться w/option 2. – travelingbones