Link Search Menu Expand Document Documentation Menu

统计聚合

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_statsstats 聚合。将 size 设置为 0 指定不返回文档匹配项

GET /power_usage/_search
{
  "size": 0,
  "aggs": {
    "consumption_stats": {
      "stats": {
        "field": "kwh"
      }
    }
  }
}

响应包括索引中三个文档的 countminmaxavgsum

{
  ...
  "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 返回一个桶,每个桶中包含计算出的 countminmaxavgsum 字段

{
  ...
  "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 聚合反映了 12007001500 瓦时的值

{
  ...
  "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
    }
  }
}

将值脚本与字段一起使用

当将字段与转换结合使用时,可以同时指定 fieldscript。这允许在脚本中使用 _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
      }
    }
  }
}

剩余 350 字符

有问题?

想贡献?