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

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

上一篇讲了Elasticsearch聚合查询中的Metric聚合Elasticsearch(8) --- 聚合查询(Metric聚合)html

说明 本文主要参考于Elasticsearch 官方文档 7.3版本。 Bucket Aggregationsjson

概念Bucket 能够理解为一个桶,它会遍历文档中的内容,凡是符合某一要求的就放入一个桶中,分桶至关与 SQL 中的 group byapp

这篇博客讲的桶的关键字有:Terms AggregationFilter AggregationHistogram AggregationRange AggregationDate Aggregationelasticsearch

1、建立索引、数据

一、建立索引

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

属性字段:价格、颜色、品牌、销售时间ide

二、添加索引数据

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" }

三、查看是否成功

命令ui

GET /_cat/count/cars?v

能够看到该索引存在,而且有8条文档数据。.net


2、Terms Aggregation

官方7.3文档Terms Aggregationcode

概念 : 根据某一项的每一个惟一的值的聚合。orm

一、根据品牌分桶

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

返回结果htm

二、分桶后只显示文档数量前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那就看官网吧。

3、 Filter Aggregation

官方文档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" }}
        }
      }
    }
  }
}

返回


4、Histogram Aggreagtion

官方文档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
            }
        }
    }
}

返回


5、Range Aggregation

官方文档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 }
                ]
            }
        }
    }
}

返回

6、 Date Aggregation

官方文档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个月前以后的分为一个桶


参考

一、Elasticsearch核心技术与实战---阮一鸣(eBay Pronto平台技术负责人

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

三、Elasticsearch聚合——Bucket Aggregations

四、ElasticSearch-聚合bucket




我相信,不管从此的道路多么坎坷,只要抓住今天,早晚会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,赛过虚度中的一月一年!(14)
相关文章
相关标签/搜索