Weighted Avg Aggregation

单值度量标准聚合,用于计算从聚合文档中提取的数值的加权平均值。可以从文档中的特定数字字段提取这些值。

在计算常规平均值时,每个数据点具有相等的“权重”……它对最终值的贡献相等。另一方面,加权平均值对每个数据点的权重不同。每个数据点对最终值的贡献量是从文档中提取的,或由脚本提供的。

作为公式,加权平均值是Σ(值*权重)/Σ(权重)

常规平均值可以被认为是加权平均值,其中每个值的隐含权重为1。

Table 4. weighted_avg Parameters

Parameter Default
Name Description Required
value 提供值的字段或脚本的配置 Required
weight 提供权重的字段或脚本的配置 Required
format 数字响应格式化程序 Optional
value_type 关于纯脚本或未映射字段的值的提示 Optional

值和权重对象具有每个字段的特定配置:

Table 5. value Parameters

Paranameter Name Description Required Defult Value
field 应从中提取值的字段 Required
missing 如果字段完全丢失则使用的值 Optional

Table 6. weight Parameters

Paranameter Name Description Required Defult Value
field 应从中提权重的字段 Required
missing 如果场地完全缺失则使用的权重 Optional

Examples 如果我们的文档的“等级”字段包含0-100数字分数,而“权重”字段包含任意数字权重,我们可以使用以下公式计算加权平均值:

  1. POST /exams/_search
  2. {
  3. "size": 0,
  4. "aggs" : {
  5. "weighted_grade": {
  6. "weighted_avg": {
  7. "value": {
  8. "field": "grade"
  9. },
  10. "weight": {
  11. "field": "weight"
  12. }
  13. }
  14. }
  15. }
  16. }

产生如下响应:

  1. {
  2. ...
  3. "aggregations": {
  4. "weighted_grade": {
  5. "value": 70.0
  6. }
  7. }
  8. }

虽然允许多个每字段值,但只允许一个权重。如果聚合遇到具有多个权重的文档(例如,权重字段是多值字段),则它将引发异常。如果遇到这种情况,则需要为权重字段指定脚本,并使用该脚本将多个值组合为要使用的单个值。

该单个权重将独立应用于从值字段中提取的每个值。

此示例显示如何使用单个权重对具有多个值的单个文档进行平均:

  1. POST /exams/_doc?refresh
  2. {
  3. "grade": [1, 2, 3],
  4. "weight": 2
  5. }
  6. POST /exams/_search
  7. {
  8. "size": 0,
  9. "aggs" : {
  10. "weighted_grade": {
  11. "weighted_avg": {
  12. "value": {
  13. "field": "grade"
  14. },
  15. "weight": {
  16. "field": "weight"
  17. }
  18. }
  19. }
  20. }
  21. }

三个值(1,2和3)将作为独立值包含在内,所有值均为2:

  1. {
  2. ...
  3. "aggregations": {
  4. "weighted_grade": {
  5. "value": 2.0
  6. }
  7. }
  8. }

聚合返回2.0作为结果,它与我们手工计算时的预期相符:((1 2)+(2 2)+(3 * 2))/(2 + 2 + 2)== 2

Script

值和权重都可以从脚本而不是字段派生。举个简单的例子,下面将使用脚本在文档中添加一个等级和权重:

  1. POST /exams/_search
  2. {
  3. "size": 0,
  4. "aggs" : {
  5. "weighted_grade": {
  6. "weighted_avg": {
  7. "value": {
  8. "script": "doc.grade.value + 1"
  9. },
  10. "weight": {
  11. "script": "doc.weight.value + 1"
  12. }
  13. }
  14. }
  15. }
  16. }

Missing values

缺少的参数定义了应该如何处理缺少值的文档。值和权重的默认行为是不同的:

默认情况下,如果缺少值字段,则忽略文档,聚合将移至下一个文档。如果缺少权重字段,则假设权重为1(与正常平均值一样)。

可以使用缺少的参数覆盖这两个默认值:

  1. POST /exams/_search
  2. {
  3. "size": 0,
  4. "aggs" : {
  5. "weighted_grade": {
  6. "weighted_avg": {
  7. "value": {
  8. "field": "grade",
  9. "missing": 2
  10. },
  11. "weight": {
  12. "field": "weight",
  13. "missing": 3
  14. }
  15. }
  16. }
  17. }
  18. }