更新時間:2021-11-03 來源:黑馬程序員 瀏覽量:
什么是聚合?聚合(aggregations)可以實現對文檔數據的統計、分析、運算。聚合常見的有三類:
桶(Bucket)聚合:用來對文檔做分組,有TermAggregation和Date Histogram兩類
TermAggregation:按照文檔字段值分組;
Date Histogram:按照日期階梯分組,例如一周為一組,或者一月為一組;
度量(Metric)聚合:用以計算一些值,比如:最大值、最小值、平均值等
Avg:求平均值;
Max:求最大值;
Min:求最小值;
Stats:同時求max、min、avg、sum等
管道(pipeline)聚合:其它聚合的結果為基礎做聚合。
DSL實現Bucket聚合
現在,我們要統計所有數據中的酒店品牌有幾種,此時可以根據酒店品牌的名稱做聚合。類型為term類型,DSL示例:
GET /hotel/_search { "size": 0, // 設置size為0,結果中不包含文檔,只包含聚合結果 "aggs": { // 定義聚合 "brandAgg": { //給聚合起個名字 "terms": { // 聚合的類型,按照品牌值聚合,所以選擇term "field": "brand", // 參與聚合的字段 "size": 20 // 希望獲取的聚合結果數量 } } } }
默認情況下,Bucket聚合會統計Bucket內的文檔數量,記為_count,并且按照_count降序排序。我們可以修改結果排序方式:
GET /hotel/_search { "size": 0, "aggs": { "brandAgg": { "terms": { "field": "brand", "order": { "_count": "asc" // 按照_count升序排列 }, "size": 20 } } } }
默認情況下,Bucket聚合是對索引庫的所有文檔做聚合,我們可以限定要聚合的文檔范圍,只要添加query條件即可:
GET /hotel/_search { "query": { "range": { "price": { "lte": 200 // 只對200元以下的文檔聚合 } } }, "size": 0, "aggs": { "brandAgg": { "terms": { "field": "brand", "size": 20 } } } }
總結:
aggs代表聚合,與query同級,此時query的作用是限定聚合的的文檔范圍。
聚合必須的三要素:聚合名稱、聚合類型、聚合字段。
聚合可配置屬性有size:指定聚合結果數量、order:指定聚合結果排序方式、field:指定聚合字段。
猜你喜歡: