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 聚合查询!🚀😊

posted on   朝朝暮Mu  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示