ElasticSearch 数据聚合与运算

1、数据聚合

聚合(aggregations)可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多,而且查询速度非常快,可以实现近实时搜索效果。

注意: 参加聚合的字段必须是 keyword、日期、数值和布尔类型

1.1 聚合的种类

常见的聚合类型:

1.1.1 桶聚合(Bucket):对文档分组,类似 MySQL的 group by 功能
类型 描述
TermAggregation 按照文档字段值分组,如:品牌分组
Date Histogram 按照日期阶梯分组,如:按月分组
1.1.2 度量聚合(Metric):值计算,如:最大值、最小值、平均值等等
类型 描述
Avg 求平均值
Max 求最大值
Min 求最小值
Stats 同时求max、min、avg、sum等
1.1.3 管道聚合(pipeline): 对已聚合的结果为基础做聚合

1.2 聚合示例测试1

需求:从所有酒店数据中,查询酒店金额不大于300的所有酒店品牌的种类,并按照品牌的数量进行逆序排序,筛选出前5个数量最多的品牌。

分析:① 限制酒店金额 ② 根据酒店的品牌做聚合(Bucket)查询 ③ 逆序排序

1.2.1 定义 DSL 语法
shell 复制代码
GET /hotel/_search
{
    "query": {
        "range": {
            "price": {
                "lte": 300
            }
        }
    },
    "size": 0,
    "aggs": {
        "brandAggs": {
            "terms": {
                "field": "brand",
                "size": 5,
                "order": {
                    "_count": "desc"
                }
            }
        }
    }
}
1.2.2 参数说明
  • size: 设置为0,结果中不需要包含文档,只返回聚合结果
  • aggs :定义聚合,固定值
    • brandAgg :聚合名称,自定义语义化即可
      • terms: 聚合类型,brand 是一个 keyword 类型的字符串,所以用 terms
      • field:参与聚合的字段
      • size:希望获取的聚合结果数量
      • order:指定排序,按照 _count 逆序排序
1.2.3 测试结果

1.3 聚合示例测试2

需求: 对酒店的品牌分组,并计算每个品牌的用户评分的最大值、最小值和平均值等,并按照酒店评分的平均值逆序排序

分析:① 对品牌进行桶(Bucket )聚合 ② 对桶聚合的结果进行(Metric)聚合运算

1.3.1 定义 DSL 语法
shell 复制代码
GET /hotel/_search
{
    "size": 0,
    "aggs": {
        "brandAgg": {
            "terms": {
                "field": "brand",
                "size": 10,
                "order": {
                    "scoreAgg.avg": "desc"
                }
            },
            "aggs": {
                "scoreAgg": {
                    "stats": {
                        "field": "score"
                    }
                }
            }
        }
    }
}
1.3.2 参数说明
  • size: 设置为0,结果中不需要包含文档,只返回聚合结果
  • aggs :定义聚合,固定值
    • brandAgg :聚合名称,自定义语义化即可
      • terms : 聚合类型,brand 是一个 keyword 类型的字符串,所以用 terms
        • field:参与聚合的字段
        • size:希望获取的聚合结果数量
        • order:指定排序,这里按照 "scoreAgg.avg" 逆序排序
    • aggs :对 brandAggs 的子聚合,也就是说多聚合后的结果分别计算,固定值
      • scoreAgg :聚合名称,自定义语义化即可
        • stats:Metric 聚合计算,这里的 stats 可以计算 min、max、avg、sum的值
        • field:聚合字段
1.3.3 测试结果

1.4 聚合示例测试3

需求:对酒店的品牌分组,累加品牌评分,按累计评分逆序排序,筛选出前5名,计算每个品牌评分占总评分的比率

分析:① 对品牌进行桶(Bucket )聚合 ② 对桶聚合的结果进行(Metric )聚合运算 ③ 聚合计算(Pipeline)④ 逻辑运算

1.4.1 定义 DSL 语法
shell 复制代码
GET /hotel/_search
{
    "size": 0,
    "aggs": {
        "brandAgg": {
            "terms": {
                "field": "brand",
                "size": 5,
                "order": {
                    "singleBrandTotalScore": "desc"
                }
            },
            "aggs": {
                "singleBrandTotalScore": {
                    "sum": {
                        "field": "score"
                    }
                }
            }
        },
        "allBrandTotalScore": {
            "sum_bucket": {
                "buckets_path": "brandAgg>singleBrandTotalScore"
            }
        }
    }
}
1.4.2 参数说明
  • size: 设置为0,结果中不需要包含文档,只返回聚合结果
  • aggs :定义聚合,固定值
    • brandAgg:聚合名称,自定义语义化即可

      • terms : 聚合类型,brand 是一个 keyword 类型的字符串,所以用 terms
        • field:参与聚合的字段
        • size:希望获取的聚合结果数量
        • order:指定排序,这里按照 "singleBrandTotalScore.value" 逆序排序,sum 聚合运算 value 可省略
    • aggs:对 brandAggs 的子聚合,也就是说多聚合后的结果分别计算,固定值

      • singleBrandTotalScore : 多单一品牌的所有评分进行累加
        • sum: 对 score 字段求和
    • allBrandTotalScore:聚合名称,自定义语义化即可,每个品牌的得分总和再次求和,以获得所有品牌的总得分

      • sum_bucket : 管道聚合
        • buckets_path:指定了数据来源路径,即来自brandAgg聚合中 singleBrandTotalScore 的结果
1.4.3 测试结果
1.4.4 说明:是否可以直接将 allBrandTotalScore 计算值,传入 aggs 中直接参与计算还有待探索,若有好的方法,希望留言反馈,感谢!!!
相关推荐
ofoxcoding17 小时前
借助 CLAUDE.md 约束 Sonnet 5.5 多文件重构行为的提示词实践
大数据·elasticsearch·ai·重构
Elasticsearch17 小时前
隆重推出 AlertZero:让你的告警队列实现 “收件箱清零” 式管理
elasticsearch
ly768917 小时前
从 TF-IDF 到 BM25:Elasticsearch 相关性评分的字段长度归一化与 boost 调参边界
java·elasticsearch·query dsl·bm25·相关性评分
SL-staff17 小时前
技术实践:将Excel自动升级为可搜索的知识节点(JVS平台实现)
mongodb·elasticsearch·知识图谱·jvs平台·语义解析·企业文档管理·excel结构化
Elasticsearch17 小时前
2026 年唯一获得端点预防与响应(EPR)满分的厂商是 Elastic
elasticsearch
vx_Biye_Design18 小时前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
ly76891 天前
倒排索引与 FST 在 Lucene 中的内存布局:segment、docValues 与词典压缩的工程取舍
elasticsearch·lucene·倒排索引·doc values·fst
Elasticsearch1 天前
利用预计算上下文,更快速、更低成本地开展支持问题调查
elasticsearch
小小小米粒1 天前
重置本地git
大数据·git·elasticsearch
ly76891 天前
Spring Boot 集成 Elasticsearch 的生产实践:客户端选型、索引生命周期与批量写入容错
spring boot·elasticsearch·索引生命周期·java api client·批量写入