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 聚合查询!🚀😊
浙公网安备 33010602011771号