# 扩展统计聚合

原文链接 :[https://www.elastic.co/guide/en/elasticsearch/reference/5.3/search-aggregations-metrics-extendedstats-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/search-aggregations-metrics-extendedstats-aggregation.html)

译文链接 : [扩展统计聚合](/pages/viewpage.action?pageId=10027518)

贡献者 : @wangxiang，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

多值度量聚合计算从汇总文档中提取的数值的统计数据。这些值可以从文档中的特定数值字段中提取，也可以由提供的脚本生成。

扩展统计聚合是统计聚合（[`stats`](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/search-aggregations-metrics-stats-aggregation.html "Stats Aggregation") aggregation）的扩展版本，其中额外添加如`sum_of_squares`, `variance`, `std_deviation` and `std_deviation_bounds。`

假设数据由学生的考试成绩（0到100）组成：

```
{ 
	"aggs" : { 
		"grades_stats" : { 
			"extended_stats" : { 
				"field" : "grade" 
			} 
		} 
	} 
}
```

上述聚合计算所有文档的分数统计信息。聚合类型为extended_stats，设置文档的数字字段为需要统计的字段为grade，执行上面的语句将返回如下：

```
{
    ...

    "aggregations": {
        "grade_stats": {
           "count": 9,
           "min": 72,
           "max": 99,
           "avg": 86,
           "sum": 774,
           "sum_of_squares": 67028,
           "variance": 51.55555555555556,
           "std_deviation": 7.180219742846005,
           "std_deviation_bounds": {
            "upper": 100.36043948569201,
            "lower": 71.63956051430799
           }
        }
    }
}
```

```
聚合的名称（上面语句中的grades_stats）作为key，通过该key可以从返回的结果中检索出聚集的结果。
```

## Standard Deviation Bounds

默认情况下，扩展统计度量将返回一个对象称为std_deviation_bounds，它提供了平均值加/减两个标准差的区间。这可以成为一个用来方式来可视化数据的方差。如果你想要一个不同的边界，例如三个标准偏差，你可以在请求中设置：

```
{
    "aggs" : {
        "grades_stats" : {
            "extended_stats" : {
                "field" : "grade",
                "sigma" : 3 
            }
        }
    }
}
```

```
注释1.sigma控制应显示多少标准偏差+/-平均值。
```

sigma可以是任何非负double类型数字，这意味着你可以要求非整数值，如1.5。值为0也是有效的，但只会返回上下限的平均值。

提示：默认情况下显示标准偏差和其边界，但它们并不总是适用于所有的数据集。您的数据必须是正常分布的度量才有意义。标准偏差背后的统计数据假设为正常分布的数据，因此如果数据偏斜向左或向右，返回的值将是误导性的。

## Script

使用下面的脚本计算成绩的统计信息：

```
{
    ...,

    "aggs" : {
        "grades_stats" : {
            "extended_stats" : {
                "script" : {
                    "inline" : "doc['grade'].value",
                    "lang" : "painless"
                 }
             }
         }
    }
}
```

This will interpret the `script` parameter as an `inline` script with the `painless` script language and no script parameters. 用下面的语法来使用脚本文件：

```
{
    ...,

    "aggs" : {
        "grades_stats" : {
            "extended_stats" : {
                "script" : {
                    "file": "my_script",
                    "params": {
                        "field": "grade"
                    }
                }
            }
        }
    }
}
```

```
提示：可以使用id参数代替file参数来使用index的脚本。
```

## Value Script

当考试的难度是高于学生的水平，需要校正学生的成绩，我们可以使用value script获得新的统计：

```
{
    "aggs" : {
        ...

        "aggs" : {
            "grades_stats" : {
                "extended_stats" : {
                    "field" : "grade",
                    "script" : {
                        "lang" : "painless",
                        "inline": "_value * params.correction",
                        "params" : {
                            "correction" : 1.2
                        }
                    }
                }
            }
        }
    }
}
```

## Missing Value

missing参数定义了如何处理缺少值的文档。 默认情况下如果没有指定的字段，这种文档将被忽略，但也可以认为它们具有指定的值：

```
{
    "aggs" : {
        "grades_stats" : {
            "extended_stats" : {
                "field" : "grade",
                "missing": 0 
            }
        }
    }
}
```

```
注释1:文档中如果没有grade这个字段，则认为该字段的值是0。
```