Кластеры CSS Elasticsearch повышают производительность агрегации при больших объёмах данных за счёт использования векторизации и оптимизированного кластерирования, обеспечивая более быстрый аналитический процесс и принятие решений в сложных ситуациях.
Enhanced aggregation работает путём предварительной сортировки и физического кластеризования данных с использованием тщательно подобранных ключей сортировки и кластеризации, тем самым минимизируя сканирование данных и вычислительные нагрузки во время агрегации.
Сценарий | Описание |
|---|---|
Агрегация полей с низкой кардинальностью | Агрегирует поля, в которых небольшое количество уникальных значений. В этом случае используется группировка. Один пример — подсчёт количества заказов по городу. Операция кластеризации может легко достичь этой цели. |
Агрегация полей с высокой кардинальностью | Агрегирует поля, в которых большое количество уникальных значений. Обычно используется гистограммная агрегация. Один пример — подсчёт посещений за час. Ключ кластеризации можно использовать для ускорения агрегации данных в пределах заданного диапазона или области. |
Гибридная агрегация полей с низкой и высокой кардинальностью | Сначала группирует и агрегирует поля с низкой кардинальностью (например, заказы по городу), а затем создаёт гистограмму, используя поля с высокой кардинальностью (например, метки времени). Многоуровневая кластеризация повышает эффективность гибридных запросов. |
Только Elasticsearch 7.10.2 поддерживает расширенную агрегацию.
Обычно поля с низкой кардинальностью используют группировку в качестве способа агрегации. При наличии подходящих ключей сортировки группировка подготавливает данные для пакетной векторизации.
Например, чтобы агрегировать два поля низкой кардинальности city and product, выполните следующие шаги:
PUT testindex{"mappings": {"properties": {"date": {"type": "date","format": "yyyy-MM-dd"},"city": {"type": "keyword"},"product": {"type": "keyword"},"trade": {"type": "double"}}},"settings": {"index": {"search": {"turbo": {"enabled": "true"}},"sort": {"field": ["city","product"]},"cluster": {"field": ["city","product"]}}}}
Параметр | Тип | Описание |
|---|---|---|
index.search.turbo.enabled | Булево | Нужно ли включать расширенную агрегацию. Обычно расширенная агрегация должна быть включена там, где используются агрегации. Значение может быть:
|
index.sort.field | Массив строк | Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочивания или ранжирования документов. Вы можете указать один или несколько полей в качестве ключей сортировки. Если указано несколько полей, они будут применяться в той последовательности, в которой указаны. Сначала документы ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее. Диапазон значений: Значение должно быть полями, содержащимися в индексе. |
index.cluster.field | Массив строк | Укажите ключи кластеризации. Ключи кластеризации определяют, какие документы собираются в одни и те же кластеры. Во время операции агрегации документы в одном кластере могут обрабатываться пакетами, что существенно повышает производительность агрегации. Ограничение: Ключи кластеризации должны быть подмножеством ключей сортировки. Диапазон значений: Значение должно быть полями, содержащимися в индексе. |
PUT /_bulk{ "index": { "_index": "testindex", "_id": "1" } }{ "date": "2025-01-01", "city": "cityA", "product": "books", "trade": 3000.0}{ "index": { "_index": "testindex", "_id": "2" } }{ "date": "2025-01-02", "city": "cityA", "product": "books", "trade": 1000.0}{ "index": { "_index": "testindex", "_id": "3" } }{ "date": "2025-01-01", "city": "cityA", "product": "bottles", "trade": 100.0}{ "index": { "_index": "testindex", "_id": "4" } }{ "date": "2025-01-02", "city": "cityA", "product": "bottles", "trade": 300.0}{ "index": { "_index": "testindex", "_id": "5" } }{ "date": "2025-01-01", "city": "cityB", "product": "books", "trade": 7000.0}{ "index": { "_index": "testindex", "_id": "6" } }{ "date": "2025-01-02", "city": "cityB", "product": "books", "trade": 1000.0}
Например, запросите среднее торговля значение для каждого продукта в разных городах.
POST testindex/_search{"size": 0,"aggs": {"groupby_city": {"terms": {"field": "city"},"aggs": {"groupby_product": {"terms": {"field": "product"},"aggs": {"avg_trade": {"avg": {"field": "trade"}}}}}}}}
Поля с высокой кардинальностью обычно используют гистограммную агрегацию, что облегчает обработку данных по диапазону или области.
Например, чтобы агрегировать типичное поле с высокой кардинальностью дата, выполните следующие шаги:
PUT testindex{"mappings": {"properties": {"date": {"type": "date","format": "yyyy-MM-dd"},"score": {"type": "double"}}},"settings": {"index": {"search": {"turbo": {"enabled": "true"}},"sort": {"field": ["date"]}}}}
Параметр | Тип | Описание |
|---|---|---|
index.search.turbo.enabled | Boolean | Нужно ли включать расширенную агрегацию. Обычно расширенная агрегация должна быть включена там, где используются агрегации. Значение может быть:
|
index.sort.field | Массив строк | Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочения или ранжирования документов. Вы можете указать один или несколько полей в качестве ключей сортировки. Когда указано несколько полей, они применяются в той последовательности, в которой указаны. Документы сначала ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее. Диапазон значений: Значение должно быть полями, содержащимися в индексе. |
PUT /_bulk{ "index": { "_index": "testindex", "_id": "1" } }{ "date": "2025-01-01", "score": "12.0"}{ "index": { "_index": "testindex", "_id": "2" } }{ "date": "2025-01-02","score": "24.0"}{ "index": { "_index": "testindex", "_id": "3" } }{ "date": "2025-01-01","score": "53.0"}{ "index": { "_index": "testindex", "_id": "4" } }{ "date": "2025-01-02", "score": "22.0"}{ "index": { "_index": "testindex", "_id": "5" } }{ "date": "2025-01-01", "score": "99.0"}{ "index": { "_index": "testindex", "_id": "6" } }{ "date": "2025-01-02","score": "26.0"}
Этот запрос группирует date поле с использованием гистограммы, а затем вычисляет средний балл.
POST testindex/_search?pretty{"size": 0,"aggs": {"groupbytime": {"date_histogram": {"field": "date","calendar_interval": "day"},"aggs": {"avg_score": {"avg": {"field": "score"}}}}}}
Когда поля низкой и высокой кардинальности смешаны, сначала группируются и агрегируются поля низкой кардинальности, а затем агрегируются поля высокой кардинальности с использованием гистограмм.
Например, чтобы сначала сгруппировать поле низкой кардинальности city, затем сгруппировать поле низкой кардинальности product, а затем сгруппировать поле высокой кардинальности date в гистограмму, выполните следующие шаги:
PUT testindex{"mappings": {"properties": {"date": {"type": "date","format": "yyyy-MM-dd"},"city": {"type": "keyword"},"product": {"type": "keyword"},"trade": {"type": "double"}}},"settings": {"index": {"search": {"turbo": {"enabled": "true"}},"sort": {"field": ["city","product","date"]},"cluster": {"field": ["city","product"]}}}}
Параметр | Тип | Описание |
|---|---|---|
index.search.turbo.enabled | Boolean | Включить улучшенную агрегацию. Обычно улучшенная агрегация должна быть включена там, где используются агрегации. Значение может быть:
|
index.sort.field | Массив строк | Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочения или ранжирования документов. Вы можете указать одно или несколько полей в качестве ключей сортировки. Когда указано несколько полей, они применяются в том порядке, в котором указаны. Документы сначала ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее. Ограничение: Поля с высокой кардинальностью должны быть среди ключей сортировки и должны следовать за последним полем с низкой кардинальностью. Диапазон значений: Значение должно быть полями, содержащимися в индексе. |
index.cluster.field | Массив строк | Укажите ключи кластеризации. Ключи кластеризации определяют, какие документы собираются в одни и те же кластеры. Во время операции агрегации документы в одном кластере могут обрабатываться пакетами, что значительно повышает производительность агрегации. Ограничение: Ключи кластеризации должны быть подмножеством ключей сортировки. Диапазон значений: Значение должно быть полями, содержащимися в индексе. |
PUT /_bulk{ "index": { "_index": "testindex", "_id": "1" } }{ "date": "2025-01-01", "city": "cityA", "product": "books", "trade": 3000.0}{ "index": { "_index": "testindex", "_id": "2" } }{ "date": "2025-01-02", "city": "cityA", "product": "books", "trade": 1000.0}{ "index": { "_index": "testindex", "_id": "3" } }{ "date": "2025-01-01", "city": "cityA", "product": "bottles", "trade": 100.0}{ "index": { "_index": "testindex", "_id": "4" } }{ "date": "2025-01-02", "city": "cityA", "product": "bottles", "trade": 300.0}{ "index": { "_index": "testindex", "_id": "5" } }{ "date": "2025-01-01", "city": "cityB", "product": "books", "trade": 7000.0}{ "index": { "_index": "testindex", "_id": "6" } }{ "date": "2025-01-02", "city": "cityB", "product": "books", "trade": 1000.0}
Например, запросите среднее торговля значение каждого продукта в разных городах за каждый день, указанное дата поле.
POST testindex/_search{"size": 0,"aggs": {"groupby_region": {"terms": {"field": "city"},"aggs": {"groupby_host": {"terms": {"field": "product"},"aggs": {"groupby_timestamp": {"date_histogram": {"field": "date","interval": "day"},"aggs": {"avg_score": {"avg": {"field": "trade"}}}}}}}}}}
Test environment
Test Procedure
PUT /_template/nyc_taxis{"template": "nyc_taxis*","settings": {"index.search.turbo.enabled": false,"index.sort.field": "dropoff_datetime","number_of_shards": 3,"number_of_replicas": 0}}
PUT /_template/nyc_taxis{"template": "nyc_taxis*","settings": {"index.search.turbo.enabled": true,"index.sort.field": "dropoff_datetime","number_of_shards": 3,"number_of_replicas": 0}}
Test Result
Этот тест сосредоточен на результате запроса dropoff_datetime агрегация, то есть результаты задач autohisto_agg и date_histogram_agg. Следующая таблица сравнивает результаты тестов между случаями, когда расширенная агрегация отключена, и когда она включена.
Метрика | Задача | Единица | Расширенная агрегация отключена | Расширенная агрегация включена | Расширенная агрегация отключена | Расширенная агрегация включена | открыть/закрыть | Вывод | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
Тестовый раунд 1 | Тестовый раунд 2 | Тестовый раунд 3 | Тестовый раунд 1 | Тестовый раунд 2 | Тестовый раунд 3 | Среднее значение | Среднее значение | |||||
Минимальная пропускная способность | autohisto_agg | ops/s | 4.42 | 4.44 | 4.43 | 11.66 | 11.94 | 11.96 | 4.43 | 11.85 | 2.68 | Пропускная способность улучшилась более чем в 2,5 раза. |
Средняя пропускная способность | autohisto_agg | ops/s | 4.50 | 4.46 | 4.44 | 11.81 | 11.99 | 12.00 | 4.47 | 11.93 | 2.67 | |
Медианная Пропускная способность | autohisto_agg | ops/s | 4.51 | 4.46 | 4.44 | 11.83 | 11.98 | 12.00 | 4.47 | 11.94 | 2.67 | |
Максимальная Пропускная способность | autohisto_agg | ops/s | 4.54 | 4.48 | 4.45 | 11.90 | 12.07 | 12.02 | 4.49 | 12.00 | 2.67 | |
100‑й процентиль задержки | autohisto_agg | ms | 216.30 | - | - | - | 84.56 | 80.38 | 216.30 | 82.47 | 0.38 | Задержка уменьшается более чем на 60%. |
100‑й процентиль времени обслуживания | autohisto_agg | ms | 216.30 | - | - | - | 84.56 | 80.38 | 216.30 | 82.47 | 0.38 | |
Уровень ошибок | autohisto_agg | % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
Мин Пропускная способность | date_histogram_agg | ops/s | 4.72 | 4.67 | 4.65 | 12.57 | 12.40 | 12.59 | 4.68 | 12.52 | 2.68 | Пропускная способность увеличивается более чем в 2.5 раза. |
Средняя пропускная способность | date_histogram_agg | ops/s | 4.73 | 4.67 | 4.67 | 12.61 | 12.46 | 12.61 | 4.69 | 12.56 | 2.68 | |
Медианная пропускная способность | date_histogram_agg | ops/s | 4.73 | 4.67 | 4.67 | 12.62 | 12.46 | 12.60 | 4.69 | 12.56 | 2.68 | |
Максимальная пропускная способность | date_histogram_agg | операций/с | 4.74 | 4.67 | 4.67 | 12.64 | 12.49 | 12.63 | 4.69 | 12.59 | 2.68 | |
задержка 50‑го процентиля | date_histogram_agg | мс | 202.61 | 218.09 | 213.43 | 77.64 | 76.02 | 82.63 | 211.38 | 78.77 | 0.37 | Задержка уменьшается более чем на 60%. |
Задержка на 100‑м процентиле | date_histogram_agg | ms | 207.35 | 223.88 | 246.63 | 77.99 | - | - | 225.95 | 77.99 | 0.35 | |
Время обслуживания на 50‑м процентиле | date_histogram_agg | ms | 202.61 | 218.09 | 213.43 | 77.64 | 76.02 | 82.63 | 211.38 | 78.77 | 0.37 | |
Время обслуживания в 100‑м процентиле | date_histogram_agg | мс | 207.35 | 223.88 | 246.63 | 77.99 | - | - | 225.95 | 77.99 | 0.35 | |
уровень ошибок | date_histogram_agg | % | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | - |
Заключение теста
При одинаковой конфигурации кластера производительность агрегации значительно улучшается, когда включена расширенная агрегация. Пропускная способность запросов увеличивается более чем в 2.5 раза, а задержка снижается более чем на 60%.