ES聚合查询
Elasticsearch 聚合分析(Aggregations)
Elasticsearch 聚合(Aggregations) 是一种强大的数据分析功能,类似于 SQL 的 GROUP BY,可以用于 统计、分组、计算平均值、最大值、最小值、直方图分析 等。
🔹 1. 聚合查询的基本结构
GET test_search_index/_search { "size": 0, "aggs": { "聚合名称": { "聚合类型": { "字段名": "分析的字段" } } } }
📌 size: 0 表示 不返回文档,仅返回聚合结果。
🔹 2. 统计 job 的不同种类和数量
📌 SQL 等价于:
SELECT job, COUNT(*) FROM test_search_index GROUP BY job;
📌 Elasticsearch 查询:
GET test_search_index/_search { "size": 0, "aggs": { "job_count": { "terms": { "field": "job.keyword" } } } }
📌 注意:
• terms 表示 按字段分组。
• job.keyword 是 job 字段的 keyword 类型(ES 对 text 字段不会分组,必须使用 keyword)。
🔹 示例返回结果:
{ "aggregations": { "job_count": { "buckets": [ { "key": "Developer", "doc_count": 3 }, { "key": "Designer", "doc_count": 2 }, { "key": "Teacher", "doc_count": 1 } ] } } }
📌 解释:
• Developer 共有 3 个。
• Designer 共有 2 个。
• Teacher 共有 1 个。
🔹 3. 计算 age 的平均值
📌 SQL 等价于:
SELECT AVG(age) FROM test_search_index;
📌 Elasticsearch 查询:
GET test_search_index/_search { "size": 0, "aggs": { "average_age": { "avg": { "field": "age" } } } }
🔹 示例返回结果:
{ "aggregations": { "average_age": { "value": 35.6 } } }
📌 解释:所有用户的 age 平均值是 35.6。
🔹 4. 计算 age 的最大值 & 最小值
📌 SQL 等价于:
SELECT MAX(age), MIN(age) FROM test_search_index;
📌 Elasticsearch 查询:
GET test_search_index/_search { "size": 0, "aggs": { "max_age": { "max": { "field": "age" } }, "min_age": { "min": { "field": "age" } } } }
🔹 示例返回结果:
{ "aggregations": { "max_age": { "value": 59 }, "min_age": { "value": 22 } } }
📌 解释:
• 最大年龄:59。
• 最小年龄:22。
🔹 5. 计算 age 的分布(直方图分析)
📌 SQL 等价于:
SELECT age DIV 10 AS age_group, COUNT(*) FROM test_search_index GROUP BY age_group;
📌 Elasticsearch 查询(按 10 岁一组):
GET test_search_index/_search { "size": 0, "aggs": { "age_histogram": { "histogram": { "field": "age", "interval": 10 } } } }
🔹 示例返回结果:
{ "aggregations": { "age_histogram": { "buckets": [ { "key": 20, "doc_count": 2 }, { "key": 30, "doc_count": 4 }, { "key": 40, "doc_count": 3 }, { "key": 50, "doc_count": 1 } ] } } }
📌 解释:
• 20-29 岁:2 个人。
• 30-39 岁:4 个人。
• 40-49 岁:3 个人。
• 50-59 岁:1 个人。
🔹 6. 按 isMarried 分组并计算平均 age
📌 SQL 等价于:
SELECT isMarried, AVG(age) FROM test_search_index GROUP BY isMarried;
📌 Elasticsearch 查询:
GET test_search_index/_search { "size": 0, "aggs": { "married_group": { "terms": { "field": "isMarried" }, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } }
🔹 示例返回结果:
{ "aggregations": { "married_group": { "buckets": [ { "key": false, "doc_count": 5, "avg_age": { "value": 31.2 } }, { "key": true, "doc_count": 5, "avg_age": { "value": 42.8 } } ] } } }
📌 解释:
• 未婚(false)人数:5,平均年龄 31.2 岁。
• 已婚(true)人数:5,平均年龄 42.8 岁。
🔹 7. 复合聚合(按 job 分组后统计平均 age)
📌 SQL 等价于:
SELECT job, COUNT(*), AVG(age) FROM test_search_index GROUP BY job;
📌 Elasticsearch 查询:
GET test_search_index/_search { "size": 0, "aggs": { "job_group": { "terms": { "field": "job.keyword" }, "aggs": { "avg_age": { "avg": { "field": "age" } } } } } }
📌 结果会返回每种 job 的人数,以及 age 平均值。
🔹 8. 统计 Elasticsearch 文档总数
如果你只想获取 test_search_index 索引的文档总数:
GET test_search_index/_count
返回示例:
{ "count": 100, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 } }
📌 解释:
• 该索引共有 100 条数据。
📌 总结
需求 | 语法 |
---|---|
统计不同 job 的数量 | terms 聚合 |
计算 age 平均值 | avg 聚合 |
计算 age 最大/最小值 | max / min 聚合 |
计算 age 的分布 | histogram 直方图 |
按 isMarried 统计 age 平均值 | terms + avg 复合聚合 |
按 job 统计 age 平均值 | terms + avg 复合聚合 |
如果你有特定的分析需求,欢迎告诉我,我可以帮你写具体的 Elasticsearch 聚合查询!🚀😊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!