Elasticsearch进阶笔记第十七篇

147 阅读4分钟

Elasticsearch高手进阶篇(33)

深入聚合数据分析_bucket与metric两个核心概念的讲解

文本编辑器介绍

  • windows操作系统,原生的txt文本编辑器,一些json格式,不太方便去调整
  • notepad++,功能不是太丰富
  • sublime整个功能也比较丰富,比较好,自己可以上网去下载,官网,免费的

两个核心概念:bucket和metric

bucket:一个数据分组

city name

  • 北京 小李
  • 北京 小王
  • 上海 小张
  • 上海 小丽
  • 上海 小陈
  • 基于city划分buckets

    • 划分出来两个bucket,一个是北京bucket,一个是上海bucket
      • 北京bucket:包含了2个人,小李,小王
      • 上海bucket:包含了3个人,小张,小丽,小陈
  • 按照某个字段进行bucket划分,那个字段的值相同的那些数据,就会被划分到一个bucket中

有一些mysql的sql知识的话,聚合,首先第一步就是分组,对每个组内的数据进行聚合分析,分组,就是我们的bucket

metric:对一个数据分组执行的统计
  • 当我们有了一堆bucket之后,就可以对每个bucket中的数据进行聚合分词了,比如说计算一个bucket内所有数据的数量,或者计算一个bucket内所有数据的平均值,最大值,最小值

  • metric就是对一个bucket执行的某种聚合分析的操作,比如说求平均值求最大值求最小值

select count(*) from access_log group by user_id
  • 总结:
    • bucket:group by user_id --> 那些user_id相同的数据,就会被划分到一个bucket中
    • metric:count(*),对每个user_id bucket中所有的数据,计算一个数量

Elasticsearch高手进阶篇(34)

深入聚合数据分析_家电卖场案例以及统计哪种颜色电视销量最高

家电卖场案例背景

  • 以一个家电卖场中的电视销售数据为背景,来对各种品牌,各种颜色的电视的销量和销售额,进行各种各样角度的分析
 PUT /waws_tvs
 {
     "mappings": {
         "sales": {
             "properties": {
                 "price": {
                     "type": "long"
                 },
                 "color": {
                     "type": "keyword"
                 },
                 "brand": {
                     "type": "keyword"
                 },
                 "sold_date": {
                     "type": "date"
                 }
             }
         }
     }
 }
  • 添加数据
 POST /waws_tvs/sales/_bulk
 { "index": {}}
 { "price" : 1000, "color" : "红色", "brand" : "长虹", "sold_date" : "2016-10-28" }
 { "index": {}}
 { "price" : 2000, "color" : "红色", "brand" : "长虹", "sold_date" : "2016-11-05" }
 { "index": {}}
 { "price" : 3000, "color" : "绿色", "brand" : "小米", "sold_date" : "2016-05-18" }
 { "index": {}}
 { "price" : 1500, "color" : "蓝色", "brand" : "TCL", "sold_date" : "2016-07-02" }
 { "index": {}}
 { "price" : 1200, "color" : "绿色", "brand" : "TCL", "sold_date" : "2016-08-19" }
 { "index": {}}
 { "price" : 2000, "color" : "红色", "brand" : "长虹", "sold_date" : "2016-11-05" }
 { "index": {}}
 { "price" : 8000, "color" : "红色", "brand" : "三星", "sold_date" : "2017-01-01" }
 { "index": {}}
 { "price" : 2500, "color" : "蓝色", "brand" : "小米", "sold_date" : "2017-02-12" }

统计哪种颜色的电视销量最高

 GET /waws_tvs/sales/_search
 {
     "size" : 0,
     "aggs" : { 
         "popular_colors" : { 
             "terms" : { 
               "field" : "color"
             }
         }
     }
 }
  • size:只获取聚合结果,而不要执行聚合的原始数据
  • aggs:固定语法,要对一份数据执行分组聚合操作
  • popular_colors:就是对每个aggs,都要起一个名字,这个名字是随机的,你随便取什么都ok
  • terms:根据字段的值进行分组
  • field:根据指定的字段的值进行分组
 {
   "took": 20,
   "timed_out": false,
   "_shards": {
     "total": 5,
     "successful": 5,
     "failed": 0
   },
   "hits": {
     "total": 8,
     "max_score": 0,
     "hits": []
   },
   "aggregations": {
     "popular_colors": {
       "doc_count_error_upper_bound": 0,
       "sum_other_doc_count": 0,
       "buckets": [
         {
           "key": "红色",
           "doc_count": 4
         },
         {
           "key": "绿色",
           "doc_count": 2
         },
         {
           "key": "蓝色",
           "doc_count": 2
         }
       ]
     }
   }
 }
  • hits.hits:我们指定了size是0,所以hits.hits就是空的,否则会把执行聚合的那些原始数据给你返回回来
  • aggregations:聚合结果
  • popular_color:我们指定的某个聚合的名称
  • buckets:根据我们指定的field划分出的buckets
  • key:每个bucket对应的那个值
  • doc_count:这个bucket分组内,有多少个数据
  • 数量,其实就是这种颜色的销量

每种颜色对应的bucket中的数据的

默认的排序规则:按照doc_count降序排序

Elasticsearch高手进阶篇(35)

深入聚合数据分析_实战bucket+metric:统计每种颜色电视平均价格

GET /waws_tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": { 
            "avg_price": { 
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}

按照color去分bucket,可以拿到每个color bucket中的数量,这个仅仅只是一个bucket操作,doc_count其实只是es的bucket操作默认执行的一个内置metric

这一讲,就是除了bucket操作,分组,还要对每个bucket执行一个metric聚合统计操作

  • 在一个aggs执行的bucket操作(terms),平级的json结构下,再加一个aggs,这个第二个aggs内部,同样取个名字,执行一个metric操作,avg,对之前的每个bucket中的数据的指定的field,price field,求一个平均值
"aggs": { 
   "avg_price": { 
      "avg": {
         "field": "price" 
      }
   }
}

就是一个metric,就是一个对一个bucket分组操作之后,对每个bucket都要执行的一个metric

第一个metric,avg,求指定字段的平均值

{
  "took": 38,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "colors": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "红色",
          "doc_count": 4,
          "avg_price": {
            "value": 3250
          }
        },
        {
          "key": "绿色",
          "doc_count": 2,
          "avg_price": {
            "value": 2100
          }
        },
        {
          "key": "蓝色",
          "doc_count": 2,
          "avg_price": {
            "value": 2000
          }
        }
      ]
    }
  }
}
  • buckets,除了key和doc_count
  • avg_price:我们自己取的metric aggs的名字
  • value:我们的metric计算的结果,每个bucket中的数据的price字段求平均值后的结果
select avg(price) from tvs.sales group by color