聚合(Aggregation)概念
-
Bucket Aggregation, 桶聚合,即將穩定按照特定列的值分到不同桶中
-
Metric Aggregation, 度量聚合,對文檔數據的聚合結果進行運算,類似SQL中的聚合函數(比如 max min avg 等)
-
Pipeline Aggregation,管道聚合,對聚合結果進行二次聚合
-
Matrix Aggreagation,矩陣聚合,提供對多個字段聚合操作的支持
Bucket Aggregation(桶聚合):
- 按terms聚合(類似於mysql分組group by):
格式如下:
聚合名稱可以自己定義,建議用'_'線來分隔單詞,比如test_terms。
{
"size" : 0,
"aggs" : {
"自已命名的聚合名稱,比如test_terms" : {
"terms" : {
"field" : "字段名稱",
"size" : 10000,
"order" : {
"_term" : "asc"
}
}
}
}
}
解釋如下:
size:第一個size,為0表示不需要返回文檔,所以直接設置為0可以提高查詢速度。
aggs:aggs是aggregations的縮寫,可以寫全稱也可以縮寫。
聚合名稱:在aggs內部,需要自己定義一個聚合的名稱,建議用'_'線來分隔單詞。在返回的結果中也會用這個變量名來儲存數值的。
terms:定義單個桶(集合)的類型為 terms,按里面的field 字段進行分類,類似於sql中的group by
terms size: terms里面包含的size,默認為10,表示返回聚合查詢結果的條數。。
比如設置size為50,對指定的字段名稱聚合分組求和后,就只會返回50條。這里的size最好不要設置為0。
order: 排序。{ "_term" : "asc" }表示按照聚合的字段名稱field進行升序排列。
比如對指定的字段名稱order_date聚合分組求和后,想按照order_date升序排列,就可以使用這種方式。
{ "_count" : "asc" }表示按照doc_count(文檔數量)排序。默認是按照doc_count排序。
返回結果,如下所示:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"failed": 0
},
"hits": {
"total": 19,
"max_score": 0,
"hits": []
},
"aggregations": {
"自己命名的聚合名稱": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "14",
"doc_count": 16
},
{
"key": "10",
"doc_count": 3
}
]
}
}
}
解釋如下:
Buckets(桶/集合):滿足特定條件的文檔的集合。
hits: hits為空,因為設置了返回的文檔數量(size)為0,所以在這個文檔里面是不會包含具體的文檔的。
key:按照指定的字段分組后的字段內容。
doc_count:各個分組的數量。
Metric Aggregation(度量聚合)
類似於mysql分組統計。
比如,分組求平均值avg,求最大max,最小min等。
聚合名稱1和2需要自己命名,同樣會在返回結果中顯示。
{
"size" : 0,
"aggs": {
"自己命名的聚合名稱1": {
"terms": {
"field": "字段名稱",
"size" : 10000
},
"aggs": {
"自己命名的聚合名稱2": {
"avg": {
"field": "字段名稱"
}
}
}
}
}
}
返回結果如下:
"aggregations": {
"聚合名稱1": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "14",
"doc_count": 16,
"聚合名稱2": {
"value": 33156.1875 //這個value就是avg求得的平均值。
}
},
{
"key": "10",
"doc_count": 3,
"聚合名稱2": {
"value": 662962.3333333334
}
}
]
}
另外還有一個stas聚合,可以返回包括min,max,avg,sum,count等統計信息。
{
"size" : 0,
"aggs": {
"自己命名的聚合名稱1": {
"terms": {
"field": "字段名稱1",
"size": 10
}, "aggs": {
"自己命名的聚合名稱2": {
"stats": {
"field": "字段名稱2"
}
}
}
}
}
}
返回的結果類似如下:
"aggregations": {
"dateGrup": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "2020-10-10",
"doc_count": 19739,
"pick_num": {
"count": 17346,
"min": 1,
"max": 36148,
"avg": 55.61362850224836,
"sum": 964674
}
}]
參考資料:
http://blog.itpub.net/29715045/viewspace-2653369/