天天看點

ElasticSearch系列三 分組 聚合基礎知識

文章目錄

  • 基礎知識
    • 案例

基礎知識

bucket 其實就是分組 相當于msql 中 group by

metric 就是統計 相當于 mysql 中的count

案例

以一個家電賣場中的電視銷售資料為背景,來對各種品牌,各種顔色的電視的銷量和銷售額,進行各種各樣角度的分析

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "ppp": {
      "terms": {
        "field": "color"
      }
    }
  }
}
           

size:0 隻擷取統計之後的結果,統計用到的原始資料不顯示

aggs:固定文法聚合統計的标志

ppp:為聚合後的字段随便起一個名字

terms:需要分組的字段

ElasticSearch系列三 分組 聚合基礎知識

對每種顔色的家電求平均值

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

根據color分bucket之後 每個bucket再求平均值

在第一個aggs 裡面 平級的json結購再添加一個aggs

每種顔色的平均價格,以及找到每種顔色每個品牌的平均價格

我們可以進行多層次的下鑽

比如說,現在紅色的電視有4台,同時這4台電視中,有3台是屬于長虹的,1台是屬于小米的

紅色電視中的3台長虹的平均價格是多少?

紅色電視中的1台小米的平均價格是多少?

GET /tvs/sales/_search
{
  "size": 0,
  "aggs": {
    "colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        },
        "group_brand":{
            "terms": {
              "field": "brand"
            },
            "aggs": {
              "b_avg_p": {
                "avg": {
                  "field": "price"
                }
              }
            }
          }    
      }
    }
  }
}
           

一次bucket之後多次metric 多次計算 取最大 最小 平均 求和

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" } },
            "min_price" : { "min": { "field": "price"} }, 
            "max_price" : { "max": { "field": "price"} },
            "sum_price" : { "sum": { "field": "price" } } 
         }
      }
   }
}
           

histogram:區間分組,0-2000 ,2000-4000 來分組

統計各個價格區間内的家電的銷售總和

GET /tvs/sales/_search
{
 "size": 0,
 "aggs": {
   "price": {
     "histogram": {
       "field": "price",
       "interval": 2000
     },
     "aggs": {
       "revenue": {
         "sum": {
           "field": "price"
         }
       }
     }
   }
 }
}
           
ElasticSearch系列三 分組 聚合基礎知識

date histogram,按照我們指定的某個date類型的日期field,以及日期interval,按照一定的日期間隔,去劃分bucket

GET /tvs/sales/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold_date",
            "interval": "month", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2016-01-01",
                "max" : "2017-12-31"
            }
         }
      }
   }
}
           

min_doc_count:即使某個日期interval,2017-01-01~2017-01-31中,一條資料都沒有,那麼這個區間也是要傳回的,不然預設是會過濾掉這個區間的

extended_bounds,min,max:劃分bucket的時候,會限定在這個起始日期,和截止日期内

ElasticSearch系列三 分組 聚合基礎知識
歡迎大家關注我的微信公衆号 您的關注就是我不懈的動力 
           
ElasticSearch系列三 分組 聚合基礎知識

繼續閱讀