aggregation分類
aggregations —— 聚合,提供了一種基于查詢條件來對數據進行分桶、計算的方法。有點類似于 SQL 中的 group by 再加一些函數方法的操作。
聚合可以嵌套,由此可以組成復雜的操作(Bucketing聚合可以包含sub-aggregation)。
聚合整體上可以分為 3 類:
1. Bucketing:桶分聚合:
- 此類聚合執行的是對文檔分組的操作,把滿足相關特性的文檔分到一個桶里,即桶分。輸出結果往往是一個個包含多個文檔的桶。
- 此類聚合會有一個關鍵字(field、script),以及一些桶分(分組)的判斷條件。執行聚合操作時候,文檔會判斷每一個分組條件,如果滿足某個,該文檔就會被分為該組(fall in)。
2. Metric:指標聚合:
- 此類聚合是對文檔進行一些權值計算(比如求所有文檔某個字段的max值)。輸出結果往往是文檔的權值,相當于為文檔添加了一些統計信息。
- 此類聚合基于特定字段(field)或腳本值(generated using scripts),計算聚合中文檔的權值。
3. Pipeline:管道聚合:
- 對其它聚合操作的輸出及其關聯指標進行聚合。
- 此類聚合的作用對象往往是桶,而不是文檔,是一種后期對每個分桶的一些計算操作。
應用場景
對于 3 中聚合,常見的應用場景如下流程:
buckets 聚合對文檔進行必要的歸類(桶分) ——> metric 聚合對每個桶進行一些額外的信息計算(如:max) ——> pipeline 聚合針對所有桶做一些桶層面的統計或計算
應用示例:
{"aggs" : {"sales_per_month" : {"date_histogram" : { // bucket 聚合,按照月份進行分桶,每個月的歸屬一個桶"field" : "date","interval" : "month"},"aggs": {"sales": {"sum": { // metric 聚合,對每個桶類的 price 求和,即每月的銷售額"field": "price"}}}},"max_monthly_sales": {"max_bucket": { // pipeline 聚合,求所有桶中銷售額 sales 最大的值"buckets_path": "sales_per_month>sales" }}} }
?
aggregation結構
聚合可以是父子(嵌套)關系聚合,buckets 聚合作為父,metric 聚合作為子。
聚合也可以是兄弟關系聚合,buckets 聚合在前,pipeline 聚合在后。
結構如下:
"aggregations" : { //定義聚合對象,也可用 "aggs""<aggregation_name>" : { //聚合的名稱,用戶自定義"<aggregation_type>" : { //聚合類型,比如 "histogram"<aggregation_body> //每個聚合類型都有其自己的結構定義 }[,"meta" : { [<meta_data_body>] } ]?[,"aggregations" : { [<sub_aggregation>]+ } ]? //可以定義多個 sub-aggregation }[,"<aggregation_name_2>" : { ... } ]* //定義額外的多個平級 aggregation,只有 Bucketing 類型才有意義 }
?