ElasticSearch 桶聚合

2年前 (2022) 程序员胖胖胖虎阿
206 0 0

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


小伙伴们元旦快乐呀~

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

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

以下是视频笔记:

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

23.ElasticSearch 桶聚合(bucket)

23.1 Terms Aggregation

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

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field""publish",
        "size": 20
      }
    }
  }
}

统计结果如下:

ElasticSearch 桶聚合
image-20201204200925589

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

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

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field""publish",
        "size": 20
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

统计结果如下:

ElasticSearch 桶聚合
image-20201204201400225

23.2 Filter Aggregation

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

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

GET books/_search
{
  "aggs": {
    "NAME": {
      "filter": {
        "term": {
          "name""java"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field""price"
          }
        }
      }
    }
  }
}

23.3 Filters Aggregation

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

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

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以上的图书数量:

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,后者的优势在于可以使用日期表达式。

造数据:

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

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

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

时间直方图聚合。

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

GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_histogram": {
        "field""date",
        "calendar_interval""month"
      }
    }
  }
}

23.7 Missing Aggregation

空值聚合。

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

GET books/_search
{
  "aggs": {
    "NAME": {
      "missing": {
        "field""price"
      }
    }
  }
}

23.8 Children Aggregation

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

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

GET stu_class/_search
{
  "aggs": {
    "NAME": {
      "children": {
        "type""student"
      }
    }
  }
}

23.9 Geo Distance Aggregation

对地理位置数据做统计。

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

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 地址范围查询。

GET blog/_search
{
  "aggs": {
    "NAME": {
      "ip_range": {
        "field""ip",
        "ranges": [
          {
            "from""127.0.0.5",
            "to""127.0.0.11"
          }
        ]
      }
    }
  }
}

ElasticSearch 系列其他文章:

  1. 打算出一个 ElasticSearch 教程,谁赞成,谁反对?
  2. ElasticSearch 从安装开始
  3. ElasticSearch 第三弹,核心概念介绍
  4. ElasticSearch 中的中文分词器该怎么玩?
  5. ElasticSearch 索引基本操作
  6. ElasticSearch 文档的添加、获取以及更新
  7. ElasticSearch 文档的删除和批量操作
  8. ElasticSearch 文档路由,你的数据到底存在哪一个分片上?
  9. ElasticSearch 并发的处理方式:锁和版本控制
  10. ElasticSearch 中的倒排索引到底是什么?
  11. ElasticSearch 动态映射与静态映射
  12. ElasticSearch 四种字段类型详解
  13. ElasticSearch 中的地理类型和特殊类型
  14. ElasticSearch 23 种映射参数详解
  15. ElasticSearch 如何配置某个字段的权重?
  16. ElasticSearch 23 种映射参数详解【3】
  17. ElasticSearch 映射模版
  18. ElasticSearch 搜索入门
  19. ElasticSearch 全文搜索怎么玩?
  20. ElasticSearch 打错字还能搜索到?试试 fuzzy query!
  21. ElasticSearch 复合查询,理解 Es 中的文档评分策略!
  22. 想搜索附近评分较高的餐厅,ElasticSearch 大显身手!
  23. ElasticSearch 如何像 MySQL 一样做多表联合查询?
  24. ElasticSearch 地理位置查询与特殊查询
  25. ElasticSearch 搜索高亮与排序
  26. ElasticSearch 指标聚合






往期推荐
0
1

50+ 需求文档免费下载!

0
2

Spring Security 教程合集

0
3

接了两个私活,都是血汗钱

ElasticSearch 桶聚合

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年11月22日 上午12:08。
转载请注明:ElasticSearch 桶聚合 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...