前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch 桶聚合

ElasticSearch 桶聚合

作者头像
江南一点雨
发布2021-01-13 10:54:41
8880
发布2021-01-13 10:54:41
举报
文章被收录于专栏:玩转JavaEE玩转JavaEE

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程


小伙伴们元旦快乐呀~

2021 的第一天,想了想,还是以一篇技术文章开篇吧~

前面我们说了 Es 中的指标聚合,今天我们该聊 Es 中的桶聚合了。

以下是视频笔记:

注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。

23.ElasticSearch 桶聚合(bucket)

23.1 Terms Aggregation

Terms Aggregation 用于分组聚合,例如,统计各个出版社出版的图书总数量:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field": "publish",
        "size": 20
      }
    }
  }
}

统计结果如下:

image-20201204200925589

在 terms 分桶的基础上,还可以对每个桶进行指标聚合。

统计不同出版社所出版的图书的平均价格:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field": "publish",
        "size": 20
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

统计结果如下:

image-20201204201400225

23.2 Filter Aggregation

过滤器聚合。可以将符合过滤器中条件的文档分到一个桶中,然后可以求其平均值。

例如查询书名中包含 java 的图书的平均价格:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "filter": {
        "term": {
          "name": "java"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

23.3 Filters Aggregation

多过滤器聚合。过滤条件可以有多个。

例如查询书名中包含 java 或者 office 的图书的平均价格:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "filters": {
        "filters": [
          {
            "term":{
              "name":"java"
            }
          },{
            "term":{
              "name":"office"
            }
          }
          ]
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

23.4 Range Aggregation

按照范围聚合,在某一个范围内的文档数统计。

例如统计图书价格在 0-50、50-100、100-150、150以上的图书数量:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "to": 50
          },{
            "from": 50,
            "to": 100
          },{
            "from": 100,
            "to": 150
          },{
            "from": 150
          }
        ]
      }
    }
  }
}

23.5 Date Range Aggregation

Range Aggregation 也可以用来统计日期,但是也可以使用 Date Range Aggregation,后者的优势在于可以使用日期表达式。

造数据:

代码语言:javascript
复制
PUT blog/_doc/1
{
  "title":"java",
  "date":"2018-12-30"
}
PUT blog/_doc/2
{
  "title":"java",
  "date":"2020-12-30"
}
PUT blog/_doc/3
{
  "title":"java",
  "date":"2022-10-30"
}

统计一年前到一年后的博客数量:

代码语言:javascript
复制
GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_range": {
        "field": "date",
        "ranges": [
          {
            "from": "now-12M/M",
            "to": "now+1y/y"
          }
        ]
      }
    }
  }
}
  • 12M/M 表示 12 个月。
  • 1y/y 表示 1年。
  • d 表示天

23.6 Date Histogram Aggregation

时间直方图聚合。

例如统计各个月份的博客数量

代码语言:javascript
复制
GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
    }
  }
}

23.7 Missing Aggregation

空值聚合。

统计所有没有 price 字段的文档:

代码语言:javascript
复制
GET books/_search
{
  "aggs": {
    "NAME": {
      "missing": {
        "field": "price"
      }
    }
  }
}

23.8 Children Aggregation

可以根据父子文档关系进行分桶。

查询子类型为 student 的文档数量:

代码语言:javascript
复制
GET stu_class/_search
{
  "aggs": {
    "NAME": {
      "children": {
        "type": "student"
      }
    }
  }
}

23.9 Geo Distance Aggregation

对地理位置数据做统计。

例如查询(34.288991865037524,108.9404296875)坐标方圆 600KM 和 超过 600KM 的城市数量。

代码语言:javascript
复制
GET geo/_search
{
  "aggs": {
    "NAME": {
      "geo_distance": {
        "field": "location",
        "origin": "34.288991865037524,108.9404296875",
        "unit": "km", 
        "ranges": [
          {
            "to": 600
          },{
            "from": 600
          }
        ]
      }
    }
  }
}

23.10 IP Range Aggregation

IP 地址范围查询。

代码语言:javascript
复制
GET blog/_search
{
  "aggs": {
    "NAME": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          {
            "from": "127.0.0.5",
            "to": "127.0.0.11"
          }
        ]
      }
    }
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江南一点雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 23.ElasticSearch 桶聚合(bucket)
    • 23.1 Terms Aggregation
      • 23.2 Filter Aggregation
        • 23.3 Filters Aggregation
          • 23.4 Range Aggregation
            • 23.5 Date Range Aggregation
              • 23.6 Date Histogram Aggregation
                • 23.7 Missing Aggregation
                  • 23.8 Children Aggregation
                    • 23.9 Geo Distance Aggregation
                      • 23.10 IP Range Aggregation
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档