在elasticsearch中es支持對存儲文檔進行復雜的統計.簡稱聚合。
ES中的聚合被分為兩大類。
1、Metrics, Metrics 是簡單的對過濾出來的數據集進行avg,max等操作,是一個單一的數值。
2、ucket, Bucket 你則可以理解為將過濾出來的數據集按條件分成多個小數據集,然后Metrics會分別作用在這些小數據集上。
聚合在ELK里面是一個非常重要的概念,雖然我們在ELK stack里面用於過多的去了解es的實現過程,但是簡單的了解es的查詢過程,可以有效的幫助我們快速的入門Kibana,通過kibana鼠標點擊的方式生成聚合數據。
1、 git先下載數據導入:
git clone git@github.com:xiaoluoge11/longguo-devops.git
執行腳本:
[root@controller longguo-devops]# ./car.sh
#備注:我們會建立一個也許對汽車交易商有所用處的聚合。數據是關於汽車交易的:汽車型號,制造商,銷售價格,銷售時間以及一些其他的相關數據
Bucket:
1、 按時間統計(可以是一個時間區間的柱形圖date_histogram:kibana這樣展示):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"articles_over_time" : {
"date_histogram" : {
"field" : "sold",
"interval": "month" ##區間可以為:data.hour,munite,year等
}
}
}
}'
返回結果:
"aggregations" : {
"articles_over_time" : {
"buckets" : [
{
"key_as_string" : "2014-01-01T00:00:00.000Z",
"key" : 1388534400000,
"doc_count" : 1
},
{
"key_as_string" : "2014-02-01T00:00:00.000Z",
"key" : 1391212800000,
"doc_count" : 1
},
#####也可以這樣指定:
"field" : "sold",
"interval" : "mount",
"format" : "yyyy-MM-dd" ###指定相應的時間格式
"offset": "+6h" ###區間間隔
####或者按照時間區間來查詢:
"aggs": {
"range": {
"date_range": {
"field": "date",
"time_zone": "CET",
"ranges": [
{ "to": "2016-02-15/d" },
{ "from": "2016-02-15/d", "to" : "now/d" },
{ "from": "now/d" },
2、 返回價格區間柱形圖(Histogram Aggregation):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"prices" : {
"histogram" : {
"field" : "price",
"interval" : 5000
}
}
}
}'
### Histogram做等間距划分,統計區間的price值,看他落在那個區間,數據間隔是5000:
返回結果:
"aggregations" : {
"prices" : {
"buckets" : [
{
"key" : 10000.0,
"doc_count" : 2
},
{
"key" : 15000.0,
"doc_count" : 1
},
3、 查看每種顏色的銷量:
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
}
}
}'
###注意可能會報如下錯:
"reason" : "Fielddata is disabled on text fields by default. Set fielddata=true on [color] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
提示我們數據類型不對,我們修改一下mapping映射:
[root@controller .ssh]# curl -XPUT '192.168.63.235:9200/cars/_mapping/transactions' -d '
> {
> "properties": {
> "color": {
> "type": "text",
> "fielddata": true
> }
> }
> }'
{"acknowledged":true}
再查下就會看到統計分布的結果:
"buckets" : [
{
"key" : "red",
"doc_count" : 4
},
{
"key" : "blue",
"doc_count" : 2
},
{
"key" : "green",
"doc_count" : 2
}
4、 添加一個指標(Metric):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
,
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}'
####avg可以換成max,min,sum等。用stats就表示所有。
5、 用stats找出Metric的所有值。
curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
,
"aggs": {
"avg_price": {
"stats": {
"field": "price"
}
}
}
}
}
}'
####返回結果:
"buckets" : [
{
"key" : "red",
"doc_count" : 4,
"avg_price" : {
"count" : 4,
"min" : 10000.0,
"max" : 80000.0,
"avg" : 32500.0,
"sum" : 130000.0
}
}
本文內容出自:日志分析之 ELK stack 實戰 課程學習筆記