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 实战 课程学习笔记

转载于:https://www.cnblogs.com/hk315523748/p/6479842.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对ELK优化查询,可以从以下几个方面入手: 1. 索引优化:优化索引可以提高查询性能。可以通过将常用的字段设置为索引字段,删除过期索引等方式进行优化。 2. 查询语句优化:使用更简单的查询语句可以提高查询性能。例如,使用bool查询可以将多个查询条件进行组合,并使用filter查询可以减少查询时间。 3. 聚合查询优化:聚合查询是比较耗时的操作,可以通过限制聚合查询的范围、使用缓存等方式进行优化。 以下是使用更简单的查询语句的具体操作: 1. 使用bool查询:将多个查询条件进行组合,可以使用must、should、must_not等关键字进行组合。例如: ``` GET /index/_search { "query": { "bool": { "must": [ {"match": {"field1": "value1"}}, {"match": {"field2": "value2"}} ], "should": [ {"match": {"field3": "value3"}} ], "must_not": [ {"match": {"field4": "value4"}} ] } } } ``` 2. 使用filter查询:使用filter查询可以减少查询时间,因为filter查询不计算相关度分数。例如: ``` GET /index/_search { "query": { "bool": { "filter": [ {"term": {"field1": "value1"}}, {"range": {"field2": {"gte": "2019-01-01"}}} ] } } } ``` 3. 使用聚合查询优化:可以使用缓存等方式进行聚合查询优化。例如: ``` GET /index/_search { "query": { "bool": { "filter": [ {"term": {"field1": "value1"}} ] } }, "aggs": { "agg1": { "terms": {"field": "field2"}, "aggs": { "agg2": { "avg": {"field": "field3"} } } } } } ``` 以上是使用更简单的查询语句的具体操作。希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值