求和聚合
sum
聚合是一种单值指标聚合,它计算从所有匹配文档中的字段提取的数值总和。此聚合通常用于计算收入、数量或持续时间等指标的总计。
参数
sum
聚合支持以下参数。
参数 | 数据类型 | 描述 |
---|---|---|
field | 字符串 | 要聚合的字段。必须是数值字段。 |
script(脚本) | 对象 | 用于计算聚合自定义值的脚本。可以代替 field 或与 field 一起使用。 |
missing | 数字 | 目标字段缺失的文档使用的默认值。 |
示例
以下示例演示如何计算物流索引中记录的交付物的总重量。
创建索引
PUT /deliveries
{
"mappings": {
"properties": {
"shipment_id": { "type": "keyword" },
"weight_kg": { "type": "double" }
}
}
}
添加示例文档
POST /deliveries/_bulk?refresh=true
{"index": {}}
{"shipment_id": "S001", "weight_kg": 12.5}
{"index": {}}
{"shipment_id": "S002", "weight_kg": 7.8}
{"index": {}}
{"shipment_id": "S003", "weight_kg": 15.0}
{"index": {}}
{"shipment_id": "S004", "weight_kg": 10.3}
以下请求计算 deliveries
索引中所有文档的总重量,通过将 size
设置为 0
来省略文档命中,并返回 weight_kg
的总和。
GET /deliveries/_search
{
"size": 0,
"aggs": {
"total_weight": {
"sum": {
"field": "weight_kg"
}
}
}
}
响应包含值 45.6
,对应于 12.5
+ 7.8
+ 15.0
+ 10.3
的总和。
{
...
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"total_weight": {
"value": 45.6
}
}
}
使用脚本计算值
您可以提供一个脚本来计算聚合值,而不是直接指定字段。当值需要派生或调整时,这会很有用。
在以下示例中,每个重量在使用脚本求和之前从千克转换为克。
GET /deliveries/_search
{
"size": 0,
"aggs": {
"total_weight_grams": {
"sum": {
"script": {
"source": "doc['weight_kg'].value * 1000"
}
}
}
}
}
响应包含 total_weight_grams
值 45600
。
{
...
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"total_weight_grams": {
"value": 45600
}
}
}
将字段与值脚本结合使用
您还可以同时指定 field
和 script
,使用特殊变量 _value
来引用字段的值。当对现有字段值应用转换时,这会很有用。
以下示例在求和之前将所有重量增加 10%。
GET /deliveries/_search
{
"size": 0,
"aggs": {
"adjusted_weight": {
"sum": {
"field": "weight_kg",
"script": {
"source": "Math.round(_value * 110) / 100.0"
}
}
}
}
}
响应反映了在原始总重量上增加了 10%。
{
...
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"adjusted_weight": {
"value": 50.16
}
}
}
缺失值
默认情况下,缺少目标字段的文档将被忽略。若要使用默认值包含它们,请使用 missing
参数。
以下示例将默认值 0
分配给缺失的 weight_kg
字段。这确保了没有此字段的文档被视为 weight_kg
设置为 0
并包含在聚合中。
GET /deliveries/_search
{
"size": 0,
"aggs": {
"total_weight_with_missing": {
"sum": {
"field": "weight_kg",
"missing": 0
}
}
}
}