Elasticsearch實用的聚合操作Aggs
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": 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
}
]
}
}
}
結果如下: