terms aggregation
Тема дорожной карты · Elasticsearch
Агрегация terms в Elasticsearch — это агрегация по корзинам, которая группирует документы по уникальным значениям поля типа keyword или числового поля и возвращает N лучших корзин, отсортированных по убыванию количества документов (или по заданной метрике). Базовый запрос с агрегацией terms выглядит как {"aggs": {"by_status": {"terms": {"field": "status", "size": 10}}}} в теле запроса POST /<index>/_search и возвращает до 10 корзин, каждая из которых содержит key (значение поля) и doc_count. Агрегация terms лежит в основе фасетной навигации в приложениях поиска на базе Elasticsearch: она формирует счётчики категорий, облака тегов и опции фильтрации, которые пользователи видят на сайтах электронной коммерции и контентных платформах. Важная оговорка об точности: агрегация terms использует распределённый приближённый алгоритм — каждый шард возвращает своих N лучших кандидатов, а координирующий узел объединяет их, что может привести к незначительному занижению счётчиков для термов, не доминирующих на каждом шарде; точность можно улучшить, увеличив shard_size за счёт большей нагрузки на сеть и память. Вложенные метрические под-агрегации можно добавлять внутрь агрегации terms для вычисления статистики по каждому уникальному значению, что позволяет строить мощную фасетную аналитику в рамках одного запроса к Elasticsearch.
Как это работает
terms aggregation: суммируйте + группируйте документы во время query. Bucket aggregations группируют docs (terms = group by field, date_histogram = group by time, range = группы по диапазонам). Metric aggregations считают статы (sum, avg, min/max, percentiles, cardinality). Pipeline aggregations считают над другими aggregations (cumulative sums, moving averages, derivatives). Aggregations — основа Kibana dashboards + log аналитики, но дороги на high-cardinality полях.
Когда применять
Всегда aggregations с filtered query — aggregations по всему индексу дорого. Тюньте size на terms aggregations (дефолт 10 — больше = больше памяти + медленнее). cardinality (HyperLogLog++) для unique counts на масштабе — exact counts квадратичны. Для high-cardinality terms (user IDs) — composite agg + paging вместо одной огромной terms agg.
Типичные ошибки
Ловушки terms aggregation: aggregating без фильтра (сканирует весь индекс); огромный size на terms agg (memory blow-up); aggregating на text поле (используйте keyword subfield); не используют shard_size для контроля intra-shard accuracy vs cost trade-off.