Агрегация суммы в Elasticsearch - это мощный инструмент для анализа данных, позволяющий вычислить сумму числового поля для набора документов. Такое суммирование можно использовать в различных сценариях, например, для подсчета общего объема продаж определенного товара, определения общего количества ошибок в лог-файлах или агрегирования показателей в системах мониторинга.
В этой статье мы рассмотрим тонкости агрегирования сумм в Elasticsearch и продемонстрируем его использование на практических примерах.
Использование агрегации суммы в Elasticsearch
Чтобы выполнить агрегацию суммы, необходимо указать поле, по которому должна быть вычислена сумма. Основная структура запроса с агрегацией суммы выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 | GET /_search { "aggs": { "sum_agg_name": { "sum": { "field": "numeric_field" } } } } |
Замените "sum_agg_name" на пользовательское имя вашей агрегации, а "numeric_field" - на имя числового поля, которое вы хотите просуммировать.
Пример: Вычисление общего объема продаж для продукта
Рассмотрим индекс электронной коммерции с документами, представляющими отдельные транзакции продаж. Каждый документ содержит информацию о товаре, количестве и цене. Чтобы вычислить общее количество продаж для конкретного продукта, можно использовать следующий запрос суммирования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | GET /ecommerce/_search { "query": { "term": { "product_id": 123 } }, "aggs": { "total_sales": { "sum": { "field": "price" } } } } |
Этот запрос вернет сумму поля "price" для всех документов с "product_id", равным 123.
Объединение агрегации суммы с другими агрегациями
Elasticsearch позволяет комбинировать агрегацию сумм с другими агрегациями для выполнения более сложного анализа данных. Например, вы можете использовать агрегацию терминов для группировки документов по определенному полю, а затем применить агрегацию суммы для расчета общего объема продаж для каждой группы.
Пример: Расчет общего объема продаж по категориям товаров
Чтобы рассчитать общий объем продаж по категориям товаров, можно использовать следующий запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | GET /ecommerce/_search { "aggs": { "categories": { "terms": { "field": "category.keyword" }, "aggs": { "total_sales": { "sum": { "field": "price" } } } } } } |
Этот запрос сгруппирует документы по полю "category", а затем вычислит сумму по полю "price" для каждой группы.
Использование полей со сценариями при агрегировании суммы
В некоторых случаях вам может потребоваться выполнить вычисления над числовым полем, прежде чем агрегировать его сумму. Elasticsearch позволяет использовать поля со сценариями в агрегации сумм для достижения этой цели.
Пример: Вычисление общей суммы продаж с учетом скидки
Предположим, что каждый документ в индексе электронной коммерции имеет поле "discount_percentage". Чтобы вычислить общее количество продаж с учетом скидки, можно использовать следующий запрос:
1 2 3 4 5 6 7 8 9 10 11 12 | GET /ecommerce/_search { "aggs": { "total_sales_with_discount": { "sum": { "script": { "source": "doc['price'].value * (1 - doc['discount_percentage'].value / 100)" } } } } } |
Этот запрос вычислит цену со скидкой для каждого документа, а затем объединит сумму.