ES官网reference翻译文章(12)—Weighted Avg Aggregation

情到浓时终转凉″ 提交于 2020-01-02 16:34:01

对ES官网的reference的翻译,同时也是备忘,ES版本为7.5

下面是正文翻译,附上原文链接

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-weight-avg-aggregation.html

==================================================================================================

加权平均聚合

一种单值指标聚合,计算从聚合的文档中提取出来的数值的加权平均。这些数值可以从文档中某些特定的数值字段中提取出来,也可以使用给定的脚本生成。

当计算常规的平均值时,每个数据点的权重是一样的...每个数据点对最终值的贡献是一样的。另一方面,加权平均给每个数据点附上来不同权重。每个数据点对最终值的贡献度是从文档中提取的,或者脚本提供的。

加权平均的公式是:

常规的平均值可以认为是每个值的权重都为1的加权平均。

weighted_avg参数
参数名 描述 是否必须
value 字段配置或者提供值的脚本 必须
weight 字段配置或者提供值的脚本 必须
format 数值响应的格式器 可选
value_type 纯脚本或者未被映射的字段的值的提示 可选

value和weight参数又有特定的配置:

value参数
参数名 描述 是否必须
field 值应该从哪个字段提取 必须
missing 如果被提取值的字段为空,就使用这个值 可选

 

 

 

 

weight参数
参数名 描述 是否必须
field 权重应该从哪个字段提取 必须
missing 如果权重字段为空,就使用这个值 可选

 

 

 

 

例子

 假设我们的文档有个grade字段记录0-100的得分情况,以及有个weight字段记录的是随机的权重,我们可以这样计算加权平均:

curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type:application/json'
-d '{
    "size": 0,
    "aggs": {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                }
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}'

上面的请求会返回下面的响应:

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

尽管我们允许某些字段可能会有多个值,但weight字段是唯一的。如果聚合遇到了一个拥有超过1个weight字段的文档(比如,weight字段有多个值),聚合会跑出异常。如果你会遇到这种场景,你需要为weight字段指定一个脚本并使用这个脚本将多个值组合成一个值。

单个weight字段会独立的作用于从value字段中提取出来的值上面。

下面的例子展示了某个字段拥有多个值的文档是如何使用单个weight字段取平均值的:

# 插入一个文档
curl -X POST http://host_ip:host_port/exams/_doc?pretty
-H 'content-type:application/json'
-d '{
    "grade":[1,2,3],
    "weight":2
}'

# 利用聚合求加权平均值
curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type:application/json'
-d '{
    "aggs": {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade"
                }
                "weight": {
                    "field": "weight"
                }
            }
        }
    }
}'

grade字段的三个值(1,2,3)会作为三个独立的权重为2的值计算:

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

上面的聚合会返回2.0,这与我们的预期相符合:((1*2)+(2*2)+(3*2))/(2+2+2)=2.0

脚本

value和weight字段的值都可以从脚本中得到,不一定要从field字段中拿到。下面是个简单的例子:使用脚本对文档中的grade和weight值加1:

curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type: application/json'
-d '{
    "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作为weight字段的值。

上面的默认行为可以使用missing参数重写:

curl -X POST http://host_ip:host_port/exams/_search?pretty
-H 'content-type: application/json'
-d '{
    "size": 0,
    "aggs": {
        "weighted_grade": {
            "weighted_avg": {
                "value": {
                    "field": "grade",
                    "missing": 2
                },
                "weight": {
                    "field": "weight",
                    "missing": 3
                }
            }
        }
    }
}'
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!