概述
權值聚合類型從需要聚合的文檔中取一個值(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 聚合不同的 } }
