aggregation 详解2(metrics aggregations)
概述
权值聚合类型从需要聚合的文档中取一个值(value)来计算文档的相应权值(比如该值在这些文档中的max、sum等)。
用于计算的值(value)可以是文档的字段(field),也可以是脚本(script)生成的值。
数值权值聚合是特殊的权值聚合类型,因为它的输出权值也是数字。
数值权值聚合(注意分类只针对数值权值聚合,非数值的无此分类)输出单个权值的,叫做 single-value numeric metrics,其它生成多个权值(比如:stats)的被叫做 multi-value numeric metrics。
单值和多值数字权值聚合,在它们作为一些 Bucket 聚合的直接子聚合的时候会有明显区别。
Avg Aggregation(single-value numeric metrics)
均值聚合——基于文档的某个值,计算该值在聚合文档中的均值。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
{ "aggs" : { "avg_grade" : { "avg" : { "field" : "grade" } } //计算字段 grade 在文档中的平均值 } } //输出 { ... "aggregations": { "avg_grade": { "value": 75 } } }
Cardinality Aggregation(single-value)
基数聚合——基于文档的某个值,计算文档非重复的个数(去重计数)。
用于计算的值可以是特定的字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- precision_threshold:
- missing:文档缺省字段时的默认值
{ "aggs" : { "author_count" : { "cardinality" : { "field" : "author" //count the unique authors that match a query } } } }
stats aggregation(multi-value)
统计聚合——基于文档的某个值,计算出一些统计信息(min、max、sum、count、avg)。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
{ "aggs" : { "grades_stats" : { "stats" : { "field" : "grade" } } } } //输出 { ... "aggregations": { "grades_stats": { "count": 6, "min": 60, "max": 98, "avg": 78.5, "sum": 471 } } }
Extended Stats Aggregation(multi-value)
扩展统计聚合——基于文档的某个值,计算出一些统计信息(比普通的stats聚合多了sum_of_squares、
variance、
std_deviation
、std_deviation_bounds
)。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
- sigma:标准差界限
{ ... "aggregations": { "grade_stats": { "count": 9, "min": 72, "max": 99, "avg": 86, "sum": 774, //输出比 stats 聚合多了一些值 "sum_of_squares": 67028, "variance": 51.55555555555556, "std_deviation": 7.180219742846005, "std_deviation_bounds": { "upper": 100.36043948569201, "lower": 71.63956051430799 } } } }
Geo Bounds Aggregation
地理边界聚合——基于文档的某个字段(geo-point类型字段),计算出该字段所有地理坐标点的边界(左上角/右下角坐标点)。
配置参数
- field:用于计算的字段
- wrap_longitude:是否允许地理边界与国际日界线存在重叠
{ "query" : { "match" : { "business_type" : "shop" } }, "aggs" : { "viewport" : { "geo_bounds" : { "field" : "location", "wrap_longitude" : true } } } } //输出 { ... "aggregations": { "viewport": { "bounds": { "top_left": { //左上角经纬度 "lat": 80.45, "lon": -160.22 }, "bottom_right": { //右下角经纬度 "lat": 40.65, "lon": 42.57 } } } } }
Geo Centroid Aggregation
地理重心聚合——基于文档的某个字段(geo-point类型字段),计算所有坐标的加权重心。
配置参数
- field:用于计算的字段(geo-point类型)
{ "query" : { "match" : { "crime" : "burglary" } }, "aggs" : { "centroid" : { "geo_centroid" : { "field" : "location" } } } } //输出 { ... "aggregations": { "centroid": { "location": { //重心经纬度 "lat": 80.45, "lon": -160.22 } } } }
Max Aggregation(single)
最大值聚合——基于文档的某个值,求该值在聚合文档中的最大值。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
Min Aggregation(single)
最小值聚合——基于文档的某个值,求该值在聚合文档中的最小值。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
Sum Aggregation(single-value)
求和聚合——基于文档的某个值,求该值在聚合文档中的统计和。
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
//最大值,field { "aggs" : { "max_price" : { "max" : { "field" : "price" } } // field } } //最小值,script { "aggs" : { "min_price" : { "min" : { "script" : { //script 计算 value "file": "my_script", "params": { "field": "price" } } } } } } //总和,value script { "aggs" : { ... "aggs" : { "daytime_return" : { "sum" : { "field" : "change", // field "script" : "_value * _value" // 基于 field 用 script 计算 value } } } } }
Percentiles Aggregation(multi-value)
百分百聚合——基于聚合文档中某个数值类型的值,求这些值中
用于计算的值可以是特定的数值型字段,也可以通过脚本计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
- missing:文档缺省字段时的默认值
Script Metric Aggregation
基于脚本的权值聚合——用脚本来计算出一个权值
配置参数
- init_script:用于计算的字段
- map_script:由脚本生成用来计算的 value
- combine_script:文档缺省字段时的默认值
- reduce_script:
{ "query" : { "match_all" : {} }, "aggs": { "profit": { "scripted_metric": { "init_script" : "_agg['transactions'] = []", "map_script" : "if (doc['type'].value == \"sale\") { _agg.transactions.add(doc['amount'].value) } else { _agg.transactions.add(-1 * doc['amount'].value) }", "combine_script" : "profit = 0; for (t in _agg.transactions) { profit += t }; return profit", "reduce_script" : "profit = 0; for (a in _aggs) { profit += a }; return profit" } } } }
Top hits Aggregation
最高匹配权值聚合——跟踪聚合中相关性最高的文档。
该聚合一般用做 sub-aggregation,以此来聚合每个桶中的最高匹配的文档。
配置参数
- from:最匹配的结果中的文档个数偏移
- size:top matching hits 返回的最大文档个数(default 3)
- sort:最匹配的文档的排序方式
{ "aggs": { "top-tags": { "terms": { "field": "tags", "size": 3 }, "aggs": { "top_tag_hits": { "top_hits": { //用 tags 字段分组,每个 tag(即一个分组)只显示最后一个问题,并且只在 _source 中保留 title 字段 "sort": [ { "last_activity_date": { "order": "desc" } } ], "_source": { "include": [ "title" ] }, "size" : 1 } } } } } } //输出 "top_tags_hits": { "hits": { "total": 25365, "max_score": 1, "hits": [ { "_index": "stack", "_type": "question", "_id": "602679", "_score": 1, "_source": { "title": "Windows port opening" }, "sort": [ 1370143231177 ] } ] } }
Value Count Aggregation(single-value)
值计数聚合——计算聚合文档中某个值的个数。
用于计数的值可以是特定的数值型字段,也可以通过脚本计算而来。
该聚合一般域其它 single-value 聚合联合使用,比如在计算一个字段的平均值的时候,可能还会关注这个平均值是由多少个值计算而来。
配置参数
- field:用于计算的字段
- script:由脚本生成用来计算的 value
{ "aggs" : { "grades_count" : { "value_count" : { "field" : "grade" } } //计算 grade 字段共有多少个值,和 cardinality 聚合不同的 } }