Ваш запрос просто нуждается в небольшой настройке: измените значение параметра size
.
Как я могу вернуть N наиболее частых значений типа ключевого слова по нескольким индексам?
Вы можете использовать terms
агрегация для этого. В агрегации terms
параметр size
ограничивает количество сегментов, которые вы возвращаете. В вашем случае вы установили его на 1, и эта агрегация вернет только 1 сегмент.
Установите размер на 10 или другую подходящую сумму. Это вернет N наиболее частых значений этого поля (type
в вашем случае).
Кстати, все поиски Elasticsearch могут быть выполнены по нескольким индексам одновременно .
Что, если мне также понадобится пример документа для каждого сегмента?
Агрегирование сегментов будет собирать уникальные значения заданного вида, называемые сегментами, и подсчитывать, сколько документов находится в блоке.
Агрегирования возвращают некоторую статистику, такую как AVG()
и SUM()
, делают в SQL, для всего набора результатов. Это отдельные номера, а не документы. В вашем случае Elasticsearch сначала ограничит набор документов теми, которые соответствуют только указанному вами запросу must
, а затем вычислит все агрегации для этого набора документов.
Есть ли способ попросить Elasticsearch: go вернуться из этих результатов агрегации и получить "лучший удар" для каждого сегмента? Существует, и это называется top_hits
агрегация. В вашем случае такая top_hits
агрегация будет go внутри terms
one.
Обе агрегации terms
и top_hits
имеют свои ограничения, например, они не могут вернуть все сегменты, если они слишком многие или все соответствующие документы, поскольку Elasticsearch старается быть максимально быстрым. Пожалуйста, проверьте соответствующие страницы документации.
Что если мне понадобится полный список всех уникальных значений поля?
В этом случае вы можете использовать составное агрегирование и разбивать на сегменты, как вы уже делаете нумерацию результатов поиска (с size
и from
).
Надеюсь, это поможет!