统计聚合
stats
聚合是一种多值度量聚合,用于计算数值数据的摘要。此聚合有助于快速了解数值字段的分布。它可以直接在字段上操作,应用脚本派生值,或处理缺少字段的文档。stats
聚合返回五个值
count
:收集到的值的数量min
:最小值max
:最大值sum
:所有值的总和avg
:值的平均值(总和除以数量)
参数
stats
聚合接受以下可选参数。
参数 | 数据类型 | 描述 |
---|---|---|
field(字段) | 字符串 | 要聚合的字段。必须是数值字段。 |
script(脚本) | 对象 | 用于计算聚合自定义值的脚本。可以代替 field 使用,也可以与 field 一起使用。 |
missing(缺失) | 数字 | 用于缺少目标字段的文档的默认值。 |
示例
以下示例计算电量使用情况的 stats
聚合。
创建一个名为 power_usage
的索引,并添加包含给定小时内消耗的千瓦时 (kWh) 数量的文档
PUT /power_usage/_bulk?refresh=true
{"index": {}}
{"device_id": "A1", "kwh": 1.2}
{"index": {}}
{"device_id": "A2", "kwh": 0.7}
{"index": {}}
{"device_id": "A3", "kwh": 1.5}
要计算所有文档中 kwh
字段的统计信息,请在 kwh
字段上使用名为 consumption_stats
的 stats
聚合。将 size
设置为 0
指定不返回文档匹配项
GET /power_usage/_search
{
"size": 0,
"aggs": {
"consumption_stats": {
"stats": {
"field": "kwh"
}
}
}
}
响应包括索引中三个文档的 count
、min
、max
、avg
和 sum
值
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"consumption_stats": {
"count": 3,
"min": 0.699999988079071,
"max": 1.5,
"avg": 1.1333333452542622,
"sum": 3.400000035762787
}
}
}
按桶运行统计聚合
通过在 device_id
字段的 terms
聚合中嵌套 stats
聚合,可以计算每个设备的单独统计信息。terms
聚合根据唯一的 device_id
值将文档分组到桶中,而 stats
聚合计算每个桶内的汇总统计信息
GET /power_usage/_search
{
"size": 0,
"aggs": {
"per_device": {
"terms": {
"field": "device_id.keyword"
},
"aggs": {
"device_usage_stats": {
"stats": {
"field": "kwh"
}
}
}
}
}
}
响应为每个 device_id
返回一个桶,每个桶中包含计算出的 count
、min
、max
、avg
和 sum
字段
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"per_device": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "A1",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 1.2000000476837158,
"max": 1.2000000476837158,
"avg": 1.2000000476837158,
"sum": 1.2000000476837158
}
},
{
"key": "A2",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 0.699999988079071,
"max": 0.699999988079071,
"avg": 0.699999988079071,
"sum": 0.699999988079071
}
},
{
"key": "A3",
"doc_count": 1,
"device_usage_stats": {
"count": 1,
"min": 1.5,
"max": 1.5,
"avg": 1.5,
"sum": 1.5
}
}
]
}
}
}
这允许您通过单个查询比较不同设备的使用统计信息。
使用脚本计算派生值
您还可以使用脚本来计算 stats
聚合中使用的值。当度量值从文档字段派生或需要转换时,这非常有用。
例如,在运行 stats
聚合之前将千瓦时 (kWh) 转换为瓦时 (Wh),因为 1 kWh
等于 1,000 Wh
,您可以使用一个将每个值乘以 1,000
的脚本。以下脚本 doc['kwh'].value * 1000
用于为每个文档派生输入值
GET /power_usage/_search
{
"size": 0,
"aggs": {
"usage_wh_stats": {
"stats": {
"script": {
"source": "doc['kwh'].value * 1000"
}
}
}
}
}
响应中返回的 stats
聚合反映了 1200
、700
和 1500
瓦时的值
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"usage_wh_stats": {
"count": 3,
"min": 699.999988079071,
"max": 1500,
"avg": 1133.3333452542622,
"sum": 3400.000035762787
}
}
}
将值脚本与字段一起使用
当将字段与转换结合使用时,可以同时指定 field
和 script
。这允许在脚本中使用 _value
变量来引用字段的值。
以下示例在计算 stats
聚合之前将每个能量读数增加 5%。
GET /power_usage/_search
{
"size": 0,
"aggs": {
"adjusted_usage": {
"stats": {
"field": "kwh",
"script": {
"source": "_value * 1.05"
}
}
}
}
}
缺失值
如果某些文档不包含目标字段,则默认情况下会将其从聚合中排除。要使用默认值包含它们,可以指定 missing
参数。
以下请求将缺失的 kwh
值视为 0.0
GET /power_usage/_search
{
"size": 0,
"aggs": {
"consumption_with_default": {
"stats": {
"field": "kwh",
"missing": 0.0
}
}
}
}