聚合是一種基於搜索的數據彙總,經過組合能夠完成複雜的操做。聚合能夠對文檔進行彙總、分組等。經過聚合,咱們會獲得一個數據的概覽,是分析和總結所有的數據,而不是尋找單個文檔。html
{ "size": 0, ["query": {}, ]? "aggs" : { "${my_name}" : { "${aggregation_type}" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggs" : { [<sub_aggregation>]+ } ]? } [,"${my_name}" : { ... } ]* } }
使用kibana導入「kibana_sample_data_flights」,這個是飛機的航班信息,有地區、價格、天氣等信息。git
操做路徑:Home --> 添加數據 --> 樣例數據 --> Sample flight dataelasticsearch
根據目的地(DestCountry)進行分組,查看航班的數量分佈式
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" } } } }
根據價格區間進行分組,好比0到100元多少個,100到200元多少個ide
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { // 自定義名字 "histogram": { "field": "AvgTicketPrice", "interval": 100 // 指定區間 } } } }
輸出的結果中,key爲「100.0」表明0到100.0的數據,計算公式以下性能
bucket_key = Math.floor(value / interval) * interval
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { "date_histogram": { "field": "timestamp", "calendar_interval": "month" } } } }
注意:日期間隔設置,7.x版本用「calendar_interval」,老版本用「interval」。測試
支持的時間間隔表達式優化
計算度量這類的聚合操做是以使用一種方式或者從文檔中提取須要聚合的值爲基礎的。這些數據不但能夠從文檔(使用數據屬性)的屬性中提取出來,也可使用腳本生成。ui
支持max、min、count、sum、avg、stats(各類統計信息)、cardinality(去重後數量)、percentiles(百分位)、geo_bounds(地理邊界)code
輸出航班的最大價格,最小价格
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "mix_price": { "min": { "field": "AvgTicketPrice" } } } }
輸出各個目的地航班的最大價格,最小价格
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count":{ "terms": { "field": "DestCountry" }, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "min_price": { "min": { "field": "AvgTicketPrice" } } } } } }
一次性輸出各類統計結果,包括count、min、max、sum、avg
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_stats":{ "stats": { "field": "AvgTicketPrice" } } } }
去重後數量統計
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_cardinality":{ "cardinality": { "field": "DestCountry" } } } }
top_hits 操做,最開頭的幾個文檔。
獲取去每一個國家的航班的最小价格,下面的「"size": 5」表明獲取5個國家的航班,「"size": 2」表明最低的2個價格。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_count": { "terms": { "field": "DestCountry", "size": 5 }, "aggs": { "my_min_price": { "top_hits": { "size": 2, "sort": [ { "AvgTicketPrice": { "order": "asc" } } ] } } } } } }
好比下面,小於200一個分組,200到500一個分組,大於500個分組,能夠指定輸出的key。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_range":{ "range": { "field": "AvgTicketPrice", "ranges": [ { "to": 200 }, { "from": 200, "to": 500 }, { "key": ">500", "from": 500 } ] } } } }
百分位聚合,能夠利用百分位聚合的結果評估數據分佈,判斷數據是否扭曲,判斷數據是否雙峯分佈等。壓測的時候常用,好比95百分位對應的值表示這個值大於95%的全部值。假設結果是「10%:12ms ,..., 70%:55ms, 99%:100ms」,說明一般狀況下(70%),網頁的響應時間在12ms~55ms,99%的網頁在100ms內加載完成。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_percentiles":{ "percentiles": { "field": "AvgTicketPrice", "percents": [ 1, 5, 25, 50, 75, 95, 99 ] } } } }
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_geo_bounds": { "geo_bounds": { "field": "DestLocation", "wrap_longitude": true } } } }
設置 eager_global_ordinals 爲true,會在內存中預先加載這些數據。
對聚合分析的結果再次作聚合分析。
分兩類
說明,bucket_path參數,指定路徑,若是是二級路徑,注意有一個「>」。
根據不一樣的目的地獲取平均票據,並對這些平均票價作分析。
注意,my_distance
,my_avg_price
,my_result
這三個是自定義的變量名,buckets_path指定路徑。
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "terms": { "field": "DestCountry" }, "aggs": { "my_avg_price": { "avg": { "field": "AvgTicketPrice" } } } }, "my_result": { "stats_bucket": { "buckets_path": "my_distance>my_avg_price" } } } }
統計每50km的平均票價,並查看其波動
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "histogram": { "field": "DistanceKilometers", "interval": 50 }, "aggs": { "my_avg_price": { "avg": { "field": "AvgTicketPrice" } }, "my_result": { "derivative": { "buckets_path": "my_avg_price" } } } } } }
根據數量(_count)進行排序,數量相同根據返回的key進行排序
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry", "order": [ { "_count": "asc" }, { "_key": "desc" } ] } } } }
根據最終返回的結果進行排序,好比下面的my_stats
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_distance": { "terms": { "field": "DestCountry", "order": { "my_stats.min": "asc" } }, "aggs": { "my_stats": { "stats": { "field": "AvgTicketPrice" } } } } } }
Terms 聚合分析不許的緣由,數據分散在多個分片上,Coordinating Node 沒法獲取數據全貌。
打開 show_term_doc_count_error,能夠多看到兩個返回值。
那麼如何解決呢?
shard_size 的默認大小 「shard_size = size * 1.5 * 10」,能夠根據本身的須要進行設置。