如何在Elasticsearch中计算各device_type占总数的百分比?
解决方案
要计算每个device_type对应的占比(当前设备类型文档数与总文档数的比值),你需要调整聚合结构,让bucket_script能同时获取到单设备分组的数量和全局总数。具体实现如下:
修改后的查询语句:
GET some_index/_search { "size": 0, "aggs": { "total": { "value_count": { "field": "_id" } }, "per_device": { "terms": { "field": "device_type", "size": 10 }, "aggs": { "device_count": { "value_count": { "field": "_id" } }, "device_ratio": { "bucket_script": { "buckets_path": { "deviceTotal": "device_count", "globalTotal": "total" }, "script": "params.deviceTotal / params.globalTotal" } } } } } }
核心逻辑说明
- 顶级聚合
total负责统计所有文档的总数 - 在
per_device的terms分组内,先通过device_count统计当前设备类型的文档数量 - 最后用
bucket_script聚合,通过buckets_path分别引用单设备数量和全局总数,脚本内完成除法运算得到比值;如果需要百分比结果,可把脚本改成(params.deviceTotal / params.globalTotal) * 100
内容的提问来源于stack exchange,提问作者Mehdi.Valizade
相关产品推荐
相关产品推荐

