Elasticsearch(9) --- 聚合查詢(Bucket聚合)

#<center> 聚合查詢(Bucket聚合)</center>html

上一篇講了Elasticsearch聚合查詢中的Metric聚合Elasticsearch(8) --- 聚合查詢(Metric聚合)json

說明 本文主要參考於Elasticsearch 官方文檔 7.3版本。 Bucket Aggregationsapp

概念Bucket 能夠理解爲一個桶,它會遍歷文檔中的內容,凡是符合某一要求的就放入一個桶中,分桶至關與 SQL 中的 group byelasticsearch

這篇博客講的桶的關鍵字有:Terms AggregationFilter AggregationHistogram AggregationRange AggregationDate Aggregationide

<font color=#FFD700> 1、建立索引、數據 </font>

一、建立索引

DELETE cars
PUT cars
{
  "mappings": {
      "properties": {
        "price": {
          "type":"long"
        },
        "color": {
          "type":"keyword"
        },
        "brand": {
          "type":"keyword"
        },
        "sellTime": {
          "type":"date"
        }
      }
    }
}

屬性字段:價格、顏色、品牌、銷售時間ui

二、添加索引數據

POST /cars/_bulk
{ "index": {}}
{ "price" : 80000, "color" : "red", "brand" : "BMW", "sellTime" : "2014-01-28" }
{ "index": {}}
{ "price" : 85000, "color" : "green", "brand" : "BMW", "sellTime" : "2014-02-05" }
{ "index": {}}
{ "price" : 120000, "color" : "green", "brand" : "Mercedes", "sellTime" : "2014-03-18" }
{ "index": {}}
{ "price" : 105000, "color" : "blue", "brand" : "Mercedes", "sellTime" : "2014-04-02" }
{ "index": {}}
{ "price" : 72000, "color" : "green", "brand" : "Audi", "sellTime" : "2014-05-19" }
{ "index": {}}
{ "price" : 60000, "color" : "red", "brand" : "Audi", "sellTime" : "2014-06-05" }
{ "index": {}}
{ "price" : 40000, "color" : "red", "brand" : "Audi", "sellTime" : "2014-07-01" }
{ "index": {}}
{ "price" : 35000, "color" : "blue", "brand" : "Honda", "sellTime" : "2014-08-12" }

三、查看是否成功

命令spa

GET /_cat/count/cars?v

能夠看到該索引存在,而且有8條文檔數據。.net

<br>3d

<font color=#FFD700> 2、Terms Aggregation</font>

官方7.3文檔Terms Aggregationcode

概念 : 根據某一項的每一個惟一的值的聚合。

一、根據品牌分桶

GET cars/_search?size=0
{
    "aggs" : {
        "genres" : {
            "terms" : { "field" : "brand" } 
        }
    }
}

返回結果

二、分桶後只顯示文檔數量前3的桶

GET cars/_search?size=0
{
    "aggs" : {
        "cars" : {
            "terms" : {
                "field" : "brand",
                "size" : 3
            }
        }
    }
}

返回

從圖中能夠看出文檔數量前三的桶。

三、分桶後排序

GET cars/_search?size=0
{
    "aggs" : {
        "genres" : {
            "terms" : {
                "field" : "brand",
                "order" : { "_count" : "asc" }
            }
        }
    }
}

四、顯示文檔數量大於3的桶

GET cars/_search?size=0
{
    "aggs" : {
        "brands" : {
            "terms" : {
                "field" : "brand",
                "min_doc_count": 3
            }
        }
    }
}

五、使用精確指定的詞條進行分桶

GET /cars/_search?size=0
{
    "aggs" : {
        "JapaneseCars" : {
             "terms" : {
                 "field" : "brand",
                 "include" : ["BMW", "Audi"]
             }
         }
    }
}

這裏也只展現些經常使用的,更多有關Terms Aggregation那就看官網吧。 <br>

<font color=#FFD700> 3、 Filter Aggregation</font>

官方文檔Filter AggregationFilters Aggregation

Filter概念:指具體的域和具體的值,能夠說是在 Terms Aggregation 的基礎上進行了過濾,只對特定的值進行了聚合。

一、過濾獲取品牌爲BMW的桶,並求該桶平均值

GET /cars/_search?size=0
{
    "aggs" : {
        "brands" : {
            "filter" : { "term": { "brand": "BMW" } },
            "aggs" : {
                "avg_price" : { "avg" : { "field" : "price" } }
            }
        }
    }
}

返回

二、過濾獲取品牌爲BMW的或者color爲綠色的桶

Filters概念 : Filter Aggreagtion 只能指定一個過濾條件,響應也只是單個桶。若是想要只對多個特定值進行聚合,使用 Filter Aggreagtion 只能進行屢次請求。

而使用 Filters Aggreagation 就能夠解決上述的問題,它能夠指定多個過濾條件,也是說能夠對多個特定值進行聚合。

GET /cars/_search?size=0
{
  "size": 0,
  "aggs" : {
    "cars" : {
      "filters" : {
        "filters" : {
          "colorBucket" :   { "match" : { "color" : "red"   }},
          "brandBucket" : { "match" : { "brand" : "Audi" }}
        }
      }
    }
  }
}

返回

<br>

<font color=#FFD700> 4、Histogram Aggreagtion</font>

官方文檔Histogram Aggreagtion

概念 Histogram與Terms聚合相似,都是數據分組,區別是Terms是按照Field的值分組,而Histogram能夠按照指定的間隔對Field進行分組

一、根據價格區間爲10000分桶

GET /cars/_search?size=0
{
    "aggs" : {
        "prices" : {
            "histogram" : {
                "field" : "price",
                "interval" : 10000
            }
        }
    }
}

返回

二、根據價格區間爲10000分桶,同時若是桶中沒有文檔就不顯示桶

上面的分桶咱們能夠發現價格在5000~6000 的文檔沒有也顯示爲0,咱們想把若是桶中沒有文檔就不顯示該桶

GET /cars/_search?size=0
{
    "aggs" : {
        "prices" : {
            "histogram" : {
                "field" : "price",
                "interval" : 10000,
                 "min_doc_count" : 1
            }
        }
    }
}

返回

<br>

<font color=#FFD700> 5、Range Aggregation</font>

官方文檔Range Aggregation

概念: 根據用戶傳遞的範圍參數做爲桶,進行相應的聚合。在同一個請求中,能夠傳遞多組範圍,每組範圍做爲一個桶。

一、根據價格區間分桶

GET /cars/_search?size=0
{
    "aggs" : {
        "price_ranges" : {
            "range" : {
                "field" : "price",
                "ranges" : [
                    { "to" : 50000 },
                    { "from" : 5000, "to" : 80000 },
                    { "from" : 80000 }
                ]
            }
        }
    }
}

返回

咱們也能夠指定key的名稱

GET /cars/_search?size=0
{
    "aggs" : {
        "price_ranges" : {
            "range" : {
                "field" : "price",
                "ranges" : [
                    { "key" : "xiaoyu",  "to" : 50000 },
                    {  "key" : "baohan", "from" : 5000, "to" : 80000 },
                    {  "key" : "dayu", "from" : 80000 }
                ]
            }
        }
    }
}

返回

##<font color=#FFD700> 6、 Date Aggregation</font>

官方文檔Date Histogram AggregationDate Range Aggregation

Date Histogram概念 針對於時間格式數據的直方圖聚合,基本的特性與 Histogram Aggregation 一致。

一、按月分桶顯示每月的銷量

注意 官方文檔這裏不是interval而是calendar_interval,可是按照這樣操做會報錯,由於我看的7.3的文檔,而我部署的es是7.1版本。說明這個地方7.3有了改進。

POST /cars/_search?size=0
{
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "sellTime",
                "interval" : "1M",
                "format" : "yyyy-MM-dd" 
            }
        }
    }
}

返回

二、根據指定時間區間分桶

Date Range概念 :針對於時間格式數據的範圍聚合,基本的特性與 Range Aggreagtion 一致。

POST /cars/_search?size=0
{
    "aggs": {
        "range": {
            "date_range": {
                "field": "sellTime",
                "format": "MM-yyyy",
                "ranges": [
                    { "to": "now-10M/M" }, 
                    { "from": "now-10M/M" } 
                ]
            }
        }
    }
}

上面的意思是10個月前的分爲一個桶,10個月前以後的分爲一個桶

<br> ###<font color=#FFD700> 參考</font>

一、Elasticsearch核心技術與實戰---阮一鳴(eBay Pronto平臺技術負責人

二、ES7.3版官方聚合查詢API

三、Elasticsearch聚合——Bucket Aggregations

四、ElasticSearch-聚合bucket

<br> <br>

我相信,不管從此的道路多麼坎坷,只要抓住今天,早晚會在奮鬥中嚐到人生的甘甜。抓住人生中的一分一秒,賽過虛度中的一月一年!(14)

<br>

原文出處:https://www.cnblogs.com/qdhxhz/p/11575408.html

相關文章
相關標籤/搜索