Агрегации
Агрегация подводит итоги данных в виде метрик, статистических данных или других аналитических показателей. Агрегации помогают ответить на такие вопросы, как:
- Каково среднее время загрузки моего веб-сайта?
- Кто мои самые ценные клиенты, исходя из объема транзакций?
- Какой файл можно считать большим в моей сети?
- Сколько продуктов в каждой категории?
Elasticsearch организует агрегации в три категории:
- Метрические агрегации, которые рассчитывают метрики, такие как сумма или среднее значение, из значений полей.
- Корзиновые агрегации, которые группируют документы в корзины (бин), основанные на значениях полей, диапазонах или других критериях.
- Конвейерные агрегации, которые получают входные данные от других агрегаций, а не от документов или полей.
Выполнение агрегации
Вы можете выполнить агрегацию как часть запроса поиска, указав параметр API поиска's aggs. Следующий запрос выполняет агрегацию по словам по my-field:
GET /my-index-000001/_search
{
"aggs": {
"my-agg-name": {
"terms": {
"field": "my-field"
}
}
}
} Результаты агрегации находятся в объекте aggregations ответа:
{
"took": 78,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 5,
"relation": "eq"
},
"max_score": 1.0,
"hits": [...]
},
"aggregations": {
"my-agg-name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
} | Результаты для агрегации |
Изменение области действия агрегации
Используйте параметр query, чтобы ограничить документы, на которых выполняется агрегация:
GET /my-index-000001/_search
{
"query": {
"range": {
"@timestamp": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
},
"aggs": {
"my-agg-name": {
"terms": {
"field": "my-field"
}
}
}
} Возврат только результатов агрегации
По умолчанию запросы, содержащие агрегацию, возвращают как совпадения поиска, так и результаты агрегации. Чтобы вернуть только результаты агрегации, установите size в значение 0:
GET /my-index-000001/_search
{
"size": 0,
"aggs": {
"my-agg-name": {
"terms": {
"field": "my-field"
}
}
}
} Выполнение нескольких агрегаций
Вы можете указать несколько агрегаций в одном запросе:
GET /my-index-000001/_search
{
"aggs": {
"my-first-agg-name": {
"terms": {
"field": "my-field"
}
},
"my-second-agg-name": {
"avg": {
"field": "my-other-field"
}
}
}
} Выполнение под-агрегаций
Агрегации по корзинам поддерживают вложенные агрегации по корзинам или метрические под-агрегации. Например, агрегация по словам с под-агрегацией среднего значения рассчитывает среднее значение для каждой корзины документов. Вложенность под-агрегаций не имеет ограничений по уровню или глубине.
GET /my-index-000001/_search
{
"aggs": {
"my-agg-name": {
"terms": {
"field": "my-field"
},
"aggs": {
"my-sub-agg-name": {
"avg": {
"field": "my-other-field"
}
}
}
}
}
} В ответе результаты под-агрегаций вложены под родительской агрегацией:
{
...
"aggregations": {
"my-agg-name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "foo",
"doc_count": 5,
"my-sub-agg-name": {
"value": 75.0
}
}
]
}
}
} | Результаты для родительской агрегации, | |
| Результаты для под-агрегации |
Добавление пользовательских метаданных
Используйте объект meta, чтобы связать пользовательские метаданные с агрегацией:
GET /my-index-000001/_search
{
"aggs": {
"my-agg-name": {
"terms": {
"field": "my-field"
},
"meta": {
"my-metadata-field": "foo"
}
}
}
} В ответе возвращается объект meta в том же месте:
{
...
"aggregations": {
"my-agg-name": {
"meta": {
"my-metadata-field": "foo"
},
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
} Возврат типа агрегации
По умолчанию результаты агрегации включают имя агрегации, но не ее тип. Чтобы вернуть тип агрегации, используйте параметр запроса typed_keys.
GET /my-index-000001/_search?typed_keys
{
"aggs": {
"my-agg-name": {
"histogram": {
"field": "my-field",
"interval": 1000
}
}
}
} В ответе тип агрегации возвращается как префикс к имени агрегации.
Некоторые агрегации возвращают другой тип агрегации, чем тип в запросе. Например, агрегации «terms», «significant terms» и «percentiles» возвращают различные типы агрегаций в зависимости от типа данных агрегированного поля.
{
...
"aggregations": {
"histogram#my-agg-name": {
"buckets": []
}
}
} | Тип агрегации, |
Использование скриптов в агрегации
Когда поле не соответствует нужной агрегации, следует выполнить агрегацию по временному полю:
GET /my-index-000001/_search?size=0
{
"runtime_mappings": {
"message.length": {
"type": "long",
"script": "emit(doc['message.keyword'].value.length())"
}
},
"aggs": {
"message_length": {
"histogram": {
"interval": 10,
"field": "message.length"
}
}
}
} Скрипты динамически вычисляют значения полей, что добавляет небольшую нагрузку на агрегацию. Помимо времени расчета, некоторые агрегации, такие как terms и filters, не могут использовать некоторые свои оптимизации с временными полями. В целом, затраты на производительность при использовании временного поля варьируются в зависимости от агрегации.
Кэши агрегаций
Для более быстрых ответов Elasticsearch кэширует результаты часто выполняемых агрегаций в кэше запросов фрагмента. Для получения кэшированных результатов используйте одну и ту же preference строку для каждого запроса. Если вам не нужны результаты поиска, установите size в значение 0, чтобы избежать заполнения кэша.
Elasticsearch направляет запросы с одинаковой строкой предпочтения на одни и те же фрагменты. Если данные фрагментов не изменяются между запросами, фрагменты возвращают кэшированные результаты агрегации.
Ограничения для значений long
При выполнении агрегаций Elasticsearch использует значения double для хранения и представления числовых данных. В результате агрегации по числовым данным, большим чем 253, являются приблизительными.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations.html