概述
桶分聚合不進行權值的計算,他們對文檔根據聚合請求中提供的判斷條件(比如:{"from":0, "to":100})來進行分組(桶分)。
桶分聚合還會額外返回每一個桶內文檔的個數。
桶分聚合可以包含子聚合——sub-aggregations(權值聚合不能包含子聚合,可以作為子聚合),子聚合操作將會應用到由父(parent)聚合產生的每一個桶上。
桶分聚合根據聚合條件,可以只定義輸出一個桶;也可以輸出多個;還可以在根據聚合條件動態確定桶個數(比如:terms aggregation)。
Histogram Aggregation(multi-bucket)
直方圖聚合——基於文檔中的某個【數值類型】字段,通過計算來動態的分桶。
一個文檔屬於某個桶,計算過程大致如下:
rem = value % interval if (rem < 0) { rem += interval } bucket_key = value - rem
配置參數
- field:字段,必須為數值類型
- interval:分桶間距
- min_doc_count:最少文檔數桶過濾,只有不少於這么多文檔的桶才會返回
- extended_bounds:范圍擴展
- order:對桶排序,如果 histogram 聚合有一個權值聚合類型的"直接"子聚合,那么排序可以使用子聚合中的結果
- offset:桶邊界位移,默認從0開始
- keyed:hash結構返回,默認以數組形式返回每一個桶
- missing:配置缺省默認值
{ "aggs" : { "prices" : { "histogram" : { "field" : "price", "interval" : 50, "min_doc_count" : 1, "extended_bounds" : { "min" : 0, "max" : 500 }, "order" : { "_count" : "desc" }, "keyed":true, "missing":0 } } } }
Data Histogram Aggregation(multi-bucket)
日期直方圖聚合——基於日期類型,以【日期間隔】來桶分聚合。
可用的時間間隔類型為:year、quarter、month、week、day、hour、minute、second,其中,除了year、quarter 和 month,其余可用小數形式。
配置參數
- field:
- interval:
- format:定義日期的格式,配置后會返回一個 key_as_string 的字符串類型日期(默認只有key)
- time_zone:定義時區,用作時間值的調整
- offset:
- missing:
{ "aggs" : { "articles_over_time" : { "date_histogram" : { "field" : "date", "interval" : "month", "format" : "yyyy-MM-dd", "time_zone": "+08:00" } } } }
Range Aggregation(multi-bucket)
范圍聚合——基於某個值(可以是 field 或 script),以【字段范圍】來桶分聚合。
范圍聚合包括 from 值,不包括 to 值(區間前閉后開)。
配置參數
- ranges:配置區間,數組,每一個元素是一個區間。例如:[{from:0}, {from:50, to:100}, {to:200}]
- keyed:以一個關聯的唯一字符串作為鍵,以 HASH 形式返回,而不是默認的數組
- script:利用 script 執行結果替代普通的 field 值進行聚合。script可以用file給出,還可以對其它 field 進行求值計算。
{ "aggs" : { "price_ranges" : { "range" : { "field" : "price", "ranges" : [ //包含 3 個桶 { "to" : 50 }, { "from" : 50, "to" : 100 }, { "from" : 100 } ], "keyed" : true } } } }
Date Range Aggregation(multi-bucket)
日期范圍聚合——基於日期類型的值,以【日期范圍】來桶分聚合。
日期范圍可以用各種 Date Math 表達式。
同樣的,包括 from 的值,不包括 to 的值。
配置參數
- format:定義日期格式,配置后會返回一個 [to/from]_as_string 的字符串類型日期,默認是 to/from 的數值表示
{ "aggs": { "range": { "date_range": { "field": "date", "format": "MM-yyy", "ranges": [ //包含 3 個桶 { "to": "now-10M/M" }, { "from": "now-10M/M" }, {"from":"1970-1-1", "to":"2000-1-1"} ] } } } }
Terms Aggregation(multi-bucket)
詞元聚合——基於某個field,該 field 內的每一個【唯一詞元】為一個桶,並計算每個桶內文檔個數。
默認返回順序是按照文檔個數多少排序。
當不返回所有 buckets 的情況,文檔個數可能不准確。
配置參數
- size:size用來定義需要返回多個 buckets(防止太多),默認會全部返回。(注意,如果只返回部分buckets,統計的文檔個數不一定准確(每個分片各自的top size個)。size 越大,count 會越精確。)
- order:排序方式
- min_doc_count:只返回文檔個數不小於該值的 buckets
- script:用基本來生成詞元
- include:包含過濾
- exclude:排除過濾
- execution_hint:
- collect_mode:
- missing:
{ "aggs" : { "genders" : { "terms" : { "field" : "gender", "size" : 5, "order" : { "_count" : "asc" }, "min_doc_count": 10, "include" : ".*sport.*", "exclude" : "water_.*", "missing": "N/A" } } } }
Filters Aggregation(multi-bucket)
多過濾聚合——基於多個過濾條件,來對當前文檔進行【過濾】的聚合,每個過濾都包含所有滿足它的文檔(多個bucket中可能重復)。
配置參數
- filters: 配置過濾條件,支持 HASH 或 數組格式
- other_bucket: 是否計算不滿足任何匹配條件的文檔
- other_bucket_key: 作為不匹配所有過濾條件的文檔的 bucket 名稱
{ "aggs" : { "messages" : { "filters" : { "other_bucket_key": "other_messages", //不在過濾條件范圍內的文檔都歸屬於 other_messages 桶 "filters" : { //過濾條件 "errors" : { "term" : { "body" : "error" }}, "warnings" : { "term" : { "body" : "warning" }} } }, "aggs" : { "monthly" : { "histogram" : { "field" : "timestamp", "interval" : "1M" } } } } } }
Filter Aggregation(single-bucket)
過濾聚合——基於一個條件,來對當前的文檔進行過濾的聚合。
{ "aggs" : { "red_products" : { "filter" : { "term": { "color": "red" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } } }
IPv4 Range Aggregation(multi-bucket)
IP4聚合——基於一個 IPv4 字段,對文檔進行【IPv4范圍】的桶分聚合。
和 Range Aggregation 類似,只是應用字段必須是 IPv4 數據類型。
{ "aggs" : { "ip_ranges" : { "ip_range" : { "field" : "ip", "ranges" : [ //包含 3 個桶,各個桶之間可能有文檔重復 { "to" : "10.0.0.5" }, { "from" : "10.0.0.5" }, { "from":"1.1.1.1", "to" : "10.0.0.5" }, ] } } } }
Nested Aggregation(single-bucket)
嵌套類型聚合——基於嵌套(nested)數據類型,把該【嵌套類型的信息】聚合到單個桶里,然后就可以對嵌套類型做進一步的聚合操作。
// resellers 是一個嵌套類型 { ... "product" : { "properties" : { "resellers" : { "type" : "nested", "properties" : { "name" : { "type" : "string" }, "price" : { "type" : "double" } } } } } } // 對 nested 對象里面的信息做其它聚合操作 { "query" : { "match" : { "name" : "led tv" } }, "aggs" : { "resellers" : { "nested" : { //"嵌套類型聚合"把所有嵌套信息都包含在單一的桶里,以供進一步處理 "path" : "resellers" }, "aggs" : { "min_price" : { "min" : { "field" : "resellers.price" } } //對嵌套類型聚合輸出的桶做進一步處理,這里是計算其 price 的 average } } } }