5.1.2. 加权平均聚合

加权平均聚合

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

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

作为一个公式,加权平均数是: ∑(value * weight) / ∑(weight)

一个普通的平均值可以被认为是一个加权平均值,只是其中每个值都有一个隐含权值为1。

表 3. 加权平均 参数

参数名 描述 是否必填 默认值
value 提供值的字段或脚本的配置 必填
weight 提供权重的字段或脚本的配置 必填
format 数字响应格式化 可选
value_type 有关纯脚本或未映射字段的值的提示 可选

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

表 4. value 参数设置

参数名 描述 是否必填 默认值
field 应该从中提取值的字段 必填
missing 如果字段完全丢失可使用一个值 选填

表 5. weight 参数设置

参数名 描述 是否必填 默认值
field 应该从中提取值的字段 必填
missing 如果字段完全丢失可使用一个值 选填

例子

如果我们的文档有一个等级字段,该字段的得分为0-100,而一个weight字段,该字段的得分为任意数值,则我们可以使用:

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                },
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}

得到的响应如下:

{
    ...
    "aggregations": {
        "weighted_grade": {
            "value": 70.0
        }
    }
}

虽然每个字段允许多个值,但仅允许一个权重。如果汇总中遇到的文件的权重超过一个(例如,权重字段是多值字段),它将引发异常。如果遇到这种情况,则需要为权重字段指定脚本,然后使用脚本将多个值组合为一个要使用的值。

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

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

POST /exams/_doc?refresh
{
    "grade": [1, 2, 3],
    "weight": 2
}

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                },
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}

三个值(123)将作为独立值包括在内,它们的权重均为2

{
    ...
    "aggregations": {
        "weighted_grade": {
            "value": 2.0
        }
    }
}

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

虽然每个字段允许多个值,但仅允许一个权重。如果汇总中遇到的文件的权重超过一个(例如,权重字段是多值字段),它将引发异常。如果遇到这种情况,则需要为权重字段指定脚本,然后使用脚本将多个值组合为一个要使用的值。

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

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

POST /exams/_doc?refresh
{
    "grade": [1, 2, 3],
    "weight": 2
}

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                },
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}

三个值(123)将作为独立值包括在内,它们的权重均为2

{
    ...
    "aggregations": {
        "weighted_grade": {
            "value": 2.0
        }
    }
}

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

脚本

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

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "script": "doc.grade.value + 1"
                },
                "weight": {
                    "script": "doc.weight.value + 1"
                }
            }
        }
    }
}

缺失值

 missing 参数定义了当文档缺失默认值的时候应如何处理。 value 跟 weight的默认行为是不同的:

默认情况下,如果缺少value字段,则会忽略该文档,并且聚合将继续到下一个文档。如果缺少weight字段,则假定其具有1的权重(如正常平均值)。

可以使用missing参数覆盖这两个默认值:

POST /exams/_search
{
    "size": 0,
    "aggs" : {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade",
                    "missing": 2
                },
                "weight": {
                    "field": "weight",
                    "missing": 3
                }
            }
        }
    }
}

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~