權值聚合類型從須要聚合的文檔中取一個值(value)來計算文檔的相應權值(好比該值在這些文檔中的max、sum等)。git
用於計算的值(value)能夠是文檔的字段(field),也能夠是腳本(script)生成的值。spa
數值權值聚合是特殊的權值聚合類型,由於它的輸出權值也是數字。code
數值權值聚合(注意分類只針對數值權值聚合,非數值的無此分類)輸出單個權值的,叫作 single-value numeric metrics,其它生成多個權值(好比:stats)的被叫作 multi-value numeric metrics。blog
單值和多值數字權值聚合,在它們做爲一些 Bucket 聚合的直接子聚合的時候會有明顯區別。排序
均值聚合——基於文檔的某個值,計算該值在聚合文檔中的均值。ip
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。ci
{ "aggs" : { "avg_grade" : { "avg" : { "field" : "grade" } } //計算字段 grade 在文檔中的平均值 } } //輸出 { ... "aggregations": { "avg_grade": { "value": 75 } } }
基數聚合——基於文檔的某個值,計算文檔非重複的個數(去重計數)。文檔
用於計算的值能夠是特定的字段,也能夠經過腳本計算而來。it
{ "aggs" : { "author_count" : { "cardinality" : { "field" : "author" //count the unique authors that match a query } } } }
統計聚合——基於文檔的某個值,計算出一些統計信息(min、max、sum、count、avg)。io
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
{ "aggs" : { "grades_stats" : { "stats" : { "field" : "grade" } } } } //輸出 { ... "aggregations": { "grades_stats": { "count": 6, "min": 60, "max": 98, "avg": 78.5, "sum": 471 } } }
擴展統計聚合——基於文檔的某個值,計算出一些統計信息(比普通的stats聚合多了sum_of_squares、
variance、
std_deviation
、std_deviation_bounds
)。
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
{ ... "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-point類型字段),計算出該字段全部地理座標點的邊界(左上角/右下角座標點)。
{ "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-point類型字段),計算全部座標的加權重心。
{ "query" : { "match" : { "crime" : "burglary" } }, "aggs" : { "centroid" : { "geo_centroid" : { "field" : "location" } } } } //輸出 { ... "aggregations": { "centroid": { "location": { //重心經緯度 "lat": 80.45, "lon": -160.22 } } } }
最大值聚合——基於文檔的某個值,求該值在聚合文檔中的最大值。
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
最小值聚合——基於文檔的某個值,求該值在聚合文檔中的最小值。
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
求和聚合——基於文檔的某個值,求該值在聚合文檔中的統計和。
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
//最大值,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 } } } } }
百分百聚合——基於聚合文檔中某個數值類型的值,求這些值中
用於計算的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
基於腳本的權值聚合——用腳原本計算出一個權值
{ "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" } } } }
最高匹配權值聚合——跟蹤聚合中相關性最高的文檔。
該聚合通常用作 sub-aggregation,以此來聚合每一個桶中的最高匹配的文檔。
{ "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 ] } ] } }
值計數聚合——計算聚合文檔中某個值的個數。
用於計數的值能夠是特定的數值型字段,也能夠經過腳本計算而來。
該聚合通常域其它 single-value 聚合聯合使用,好比在計算一個字段的平均值的時候,可能還會關注這個平均值是由多少個值計算而來。
{ "aggs" : { "grades_count" : { "value_count" : { "field" : "grade" } } //計算 grade 字段共有多少個值,和 cardinality 聚合不一樣的 } }