《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(6) https://developer.aliyun.com/article/1229237
8、统计聚合 stats
属于多值聚合,对聚合文档中的数值字段进行:count, min, max, avg 和 sum 的统计。
1)基础用法
以下定义了一个名称为 price_stats 类型为 stats 的聚合,并对 price 字段进行统计,该字段也将作为结果返回:
POST /order/_search?size=0 { "aggs" : { "price_stats" : { "stats" : { "field" : "price" } } } }
返回结果:
{ ... "aggregations" : { "price_stats" : { "count" : 9, "min" : 7849.46, "max" : 9999.2, "avg" : 8834.814444444444, "sum" : 79513.33 } } }
2)脚本
l 使用内置脚本:
POST /order/_search?size=0 { "aggs" : { "price_stats" : { "stats" : { "script" : { "lang":"painless", "source":"doc['price']" } } } } }
返回结果:
{ ... "aggregations" : { "price_stats" : { "count" : 9, "min" : 7849.46, "max" : 9999.2, "avg" : 8834.814444444444, "sum" : 79513.33 } } }
l 使用 runtime field 方式:
GET order/_search?size=0 { "size": 0, "runtime_mappings": { "price.discount": { "type": "double", "script": """ emit(doc['price'].value * 0.8) """ } }, "aggs": { "price_stats": { "stats": { "field": "price.discount" } } } }
3)缺失值
默认情况下,对于文档中统计字段中缺失值的情况下,这部分文档会被自动忽略掉,我们可以通过参数 missing 指定值,以下例子将对于 price 字段没有值的文档,默认按照 0 进行处理:
POST /order/_search?size=0 { "aggs" : { "price_stats" : { "stats" : { "field" : "price", "missing" : 0 } } } }
9、扩展统计聚合 extended_stats
属于多值聚合,相比统计聚合多了平方和(sum_of_squares),方差(variance),标准差
(std_deviation),平均值+/-两个标准差的区间(std_deviation_bounds)。
1)基础用法
POST /order/_search?size=0 { "aggs" : { "count_extended_stats" : { "extended_stats" : { "field" : "count" } } } }
返回结果:
{ ... "aggregations" : { "count_extended_stats" : { "count" : 10, "min" : 20.0, "max" : 30.0, "avg" : 24.6, "sum" : 246.0, "sum_of_squares" : 6162.0, "variance" : 11.039999999999964, "variance_population" : 11.039999999999964, "variance_sampling" : 12.266666666666627, "std_deviation" : 3.3226495451672244, "std_deviation_population" : 3.3226495451672244, "std_deviation_sampling" : 3.5023801430836468, "std_deviation_bounds" : { "upper" : 31.24529909033445, "lower" : 17.954700909665554, "upper_population" : 31.24529909033445, "lower_population" : 17.954700909665554, "upper_sampling" : 31.604760286167295, "lower_sampling" : 17.595239713832708 } } } }
其中 std_deviation_bounds 的使用,只有当数据是以正太分布的情况下,展示出来的指标才有意义,如果统计的数据偏左或者偏右,则返回的值将产生误导。
对于 std_deviation_bounds 若想控制显示多少个与均值+/-的标准偏差,可以通过 sigma 参数设置。sigma 可以是任何非负双精度值。当设置为0时,只会返回边界 upper 和 lower 边界的平均值。
POST /order/_search?size=0 { "aggs" : { "count_extended_stats" : { "extended_stats" : { "field" : "count", "sigma" : 2.5 } } } }
2)缺失值
默认情况下,当文档中缺失计算字段值时,该文档将会被忽略,若我们希望使用这部分文档,可以通过设置 missing 参数。以下例子中,缺失字段的 price 将按照 0 来计算。
POST /order/_search?size=0 { "aggs" : { "count_extended_stats" : { "extended_stats" : { "field" : "count", "missing" : 0 } } } }
3)脚本
修正价格字段后,在进行聚合统计:
GET order/_search?size=0 { "runtime_mappings": { "price.discount": { "type": "double", "script": { "source": "emit(Math.max(200, doc['price'].value * params.correction))", "params": { "correction": 0.8 } } } }, "aggs": { "price_stats": { "extended_stats": { "field": "price.corrected" } } } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.21.Aggregations(8) https://developer.aliyun.com/article/1229233