Агрегирование сумм
Агрегирование метрик single-value, которое суммирует числовые значения, извлеченные из агрегированных документов. Эти значения могут быть извлечены либо из конкретных числовых, либо из гистограммных полей.
Предположим, что данные состоят из документов, представляющих записи продаж. Мы можем суммировать цену продажи всех кепок с помощью:
POST /sales/_search?size=0
{
"query": {
"constant_score": {
"filter": {
"match": { "type": "hat" }
}
}
},
"aggs": {
"hat_prices": { "sum": { "field": "price" } }
}
} Что приведет к:
{
...
"aggregations": {
"hat_prices": {
"value": 450.0
}
}
} Имя агрегирования (hat_prices выше) также служит ключом, по которому результат агрегирования можно получить из возвращаемого ответа.
Скрипт
Если вам нужно получить sum для чего-то более сложного, чем одно поле, выполните агрегирование по временному полю.
POST /sales/_search?size=0
{
"runtime_mappings": {
"price.weighted": {
"type": "double",
"script": """
double price = doc['price'].value;
if (doc['promoted'].value) {
price *= 0.8;
}
emit(price);
"""
}
},
"query": {
"constant_score": {
"filter": {
"match": { "type": "hat" }
}
}
},
"aggs": {
"hat_prices": {
"sum": {
"field": "price.weighted"
}
}
}
} Пропущенное значение
Параметр missing определяет, как должны обрабатываться документы, в которых отсутствует значение. По умолчанию, документы, у которых отсутствует значение, игнорируются, но также можно обработать их так, как будто значение есть. Например, это рассматривает все продажи кепок без цены как 100.
POST /sales/_search?size=0
{
"query": {
"constant_score": {
"filter": {
"match": { "type": "hat" }
}
}
},
"aggs": {
"hat_prices": {
"sum": {
"field": "price",
"missing": 100
}
}
}
} Гистограммные поля
Когда сумма вычисляется по гистограммным полям, результатом агрегирования является сумма всех элементов в массиве values, умноженная на число в том же положении в массиве counts.
Например, для следующего индекса, который хранит предварительно агрегированные гистограммы с метриками задержки для разных сетей:
PUT metrics_index
{
"mappings": {
"properties": {
"latency_histo": { "type": "histogram" }
}
}
}
PUT metrics_index/_doc/1?refresh
{
"network.name" : "net-1",
"latency_histo" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5],
"counts" : [3, 7, 23, 12, 6]
}
}
PUT metrics_index/_doc/2?refresh
{
"network.name" : "net-2",
"latency_histo" : {
"values" : [0.1, 0.2, 0.3, 0.4, 0.5],
"counts" : [8, 17, 8, 7, 6]
}
}
POST /metrics_index/_search?size=0&filter_path=aggregations
{
"aggs" : {
"total_latency" : { "sum" : { "field" : "latency_histo" } }
}
} Для каждого гистограммного поля агрегирование sum добавит каждое число в массиве values, умноженное на соответствующее значение подсчета в массиве counts.
В конечном итоге, это добавит все значения для всех гистограмм и вернёт следующий результат:
{
"aggregations": {
"total_latency": {
"value": 28.8
}
}
}
© 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-metrics-sum-aggregation.html