松哥原创的 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
}
}
}
}
统计结果如下:
在 terms 分桶的基础上,还可以对每个桶进行指标聚合。
统计不同出版社所出版的图书的平均价格:
GET books/_search
{
"aggs": {
"NAME": {
"terms": {
"field": "publish",
"size": 20
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
统计结果如下:
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 系列其他文章:
-
打算出一个 ElasticSearch 教程,谁赞成,谁反对?
-
ElasticSearch 从安装开始
-
ElasticSearch 第三弹,核心概念介绍
-
ElasticSearch 中的中文分词器该怎么玩?
-
ElasticSearch 索引基本操作
-
ElasticSearch 文档的添加、获取以及更新
-
ElasticSearch 文档的删除和批量操作
-
ElasticSearch 文档路由,你的数据到底存在哪一个分片上?
-
ElasticSearch 并发的处理方式:锁和版本控制
-
ElasticSearch 中的倒排索引到底是什么?
-
ElasticSearch 动态映射与静态映射
-
ElasticSearch 四种字段类型详解
-
ElasticSearch 中的地理类型和特殊类型
-
ElasticSearch 23 种映射参数详解
-
ElasticSearch 如何配置某个字段的权重?
-
ElasticSearch 23 种映射参数详解【3】
-
ElasticSearch 映射模版
-
ElasticSearch 搜索入门
-
ElasticSearch 全文搜索怎么玩?
-
ElasticSearch 打错字还能搜索到?试试 fuzzy query!
-
ElasticSearch 复合查询,理解 Es 中的文档评分策略!
-
想搜索附近评分较高的餐厅,ElasticSearch 大显身手!
-
ElasticSearch 如何像 MySQL 一样做多表联合查询?
-
ElasticSearch 地理位置查询与特殊查询
-
ElasticSearch 搜索高亮与排序
-
ElasticSearch 指标聚合
1
50+ 需求文档免费下载!
2
Spring Security 教程合集
3
接了两个私活,都是血汗钱
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。