求和聚合

求和聚合 #

sum 求和聚合是一种单值指标聚合,计算字段中匹配文档中提取的数值的总和。此聚合常用于计算诸如收入、数量或持续时间等指标的总计。

参数说明 #

sum 聚合接受以下参数。

参数必需/可选数据类型描述
field必需String聚合的字段。必须是数值字段。
script可选Object用于计算聚合自定义值的脚本。可以替代或与 field 结合使用。
missing可选Number缺少目标字段时使用的默认值。

参考样例 #

以下示例演示了如何计算物流索引中记录的交付总重量。

创建一个索引:

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
    }
  }
}

将字段与值脚本结合使用 #

你也可以同时指定 fieldscript ,使用特殊变量 _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
      }
    }
  }
}