ELK 聚合查詢


在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 實戰 課程學習筆記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM