es的aggs可以分為度量聚合和桶聚合,下面就直接實戰開發中經常用到的語句。

1、度量聚合:min、max、sum、avg聚合, 度量聚合接收一個輸入文檔集並生成至少一個統計值sum。

1)sum聚合:統計不同日誌類型的總數量sum(log_type)

"aggs": {

"sum_logtype": {

"sum": {

"field": "log_type"

} }}

2)count聚合:就是count(*)

"aggs": {

"sum_logtype": {

"count": {

"field": "log_type"

} }}

3)stats聚合:返回所有度量類型的統計

"stats_year": {

"count": 4,"min": 1886,"max": 1961,"avg": 1928,"sum": 7712

}

4)avg均值聚合

{

"aggs" : {

"avg_grade" : { "avg" : { "field" : "grade" } }

}}

2、桶聚合

桶聚合返回很多子集,並限定輸入數據到一個特殊的叫做桶的子集中。可以把桶聚合想像成

類似前面切面功能的東西。

1、term聚合:詞條的聚合

terms聚合為欄位中每個詞條返回一個桶。這允許你生成欄位每個值的統計:例如每年出版多少書。類似於sql語句:count(book) group by year

統計不同日誌類型的數量

"aggs": {

"sum_logtype": {

"terms": {

"field": "log_type"

} } }}

結果簡單展示如下:

  • "buckets": [
  • {
  • "key": 3,
  • "doc_count": 22}
  • ,
  • {
  • "key": 2,
  • "doc_count": 11}
  • ,
  • {
  • "key": 1,
  • "doc_count": 5}

注意:這裡還涉及到兩個聚合的屬性,一個返回的結果size,一個排序順序

"size": 40,

"order": { "_term": "asc" }

使用key屬性(_team)排序。另一個選擇是_count來排序。

2、range聚合和date range聚合

顧名思義,range範圍和時間範圍聚合,直接上例子

"aggregations": {

"time_range": {

"range": {

"field": "timestamp",

"ranges": [

{

"to": 1487520050000

},

{

"from": 1487520050000,

"to": 1487520150000

},

{

"from": 1487520150000

}

]

}

}

}

如果需要對結果進行備註名稱,可以採用參數"keyed": true,如下的語句進行設置key的名稱:

"aggregations": {

"time_range": {

"range": {

"field": "timestamp",

"keyed": true,

"ranges": [

{

"key": "small", //可以不用設置,系統會默認制定

"to": 1487520050000

},

{

"key": "middle",

"from": 1487520050000,

"to": 1487520150000

},

{

"key": "big",

"from": 1487520150000

}

]

}

}

}

結果如下:

3)桶嵌套:還可以在聚合的內部再嵌套一個聚合,例如下面再嵌套一個度量的桶,對各個range進行度量統計。

"aggs": {

"time_range": {

"range": {

"field": "timestamp",

"keyed": true,

"ranges": [

{

"key": "small",

"to": 1487520050000

},

{

"key": "middle",

"from": 1487520050000,

"to": 1487520150000

},

{

"key": "big",

"from": 1487520150000

}

]

},

"aggs": {

"time_stat": {

"stats": {

"field": "timestamp"

}

}

} } }

還可以添加排序機制,根據平均值排序,

3)數值和日期直方圖切面 Date Histogram Aggregation

數值直方圖,這個實際應用中比較經常用到,例如每隔50000ms統計一次數據,用柱形圖顯示

數值直方圖

"aggregations": {

"test": {

"histogram": {

"field": "timestamp",

"interval": 50000

}

}

}

注意有一個參數可以選擇設置,最小統計值:"min_doc_count" : 640 最少滿足640才顯示

"aggs": {

"test": {

"histogram": {

"field": "timestamp",

"interval": 50000,

"min_doc_count": 640

}

}

}

時間直方圖採用date_histogram,原理一樣

3、使用過濾器來計算切面,過濾器返迴文檔數目的切面

談到性能,filter切面的速度比query切面或包裝查詢的filter切面更快

一個是查詢的過濾,一個是桶裡面的過濾,可以看下官方的文檔,具體我就不說了

Filter Aggregation | Elasticsearch Reference [6.2] | Elastic?

www.elastic.co
圖標

例如:

"aggs" : {

"t_shirts" : { "filter" : { "term": { "type": "t-shirt" } }, "aggs" : { "avg_price" : { "avg" : { "field" : "price" } } } } }
推薦閱讀:
相关文章