Elasticsearch 的聚合(Aggregation)用于在搜索结果上做“分组、统计、分析”,类似 SQL 里的 GROUP BY + 聚合函数。下面从概念 → 常用类型 → 示例 → 使用方式逐步说明。
聚合通常写在查询的 aggs 字段中:
GET /index_name/_search
{
"size": 0,
"aggs": {
"聚合名称": {
"聚合类型": { ... }
}
}
}
size: 0:只看聚合结果,不看原始文档aggs:聚合定义对数值做统计
| 类型 | 说明 |
|---|---|
avg |
平均值 |
sum |
求和 |
min / max |
最小 / 最大 |
value_count |
数量 |
stats |
一次性统计 |
cardinality |
去重计数 |
示例:求平均年龄
{
"aggs": {
"avg_age": {
"avg": { "field": "age" }
}
}
}
按条件分组(类似 GROUP BY)
{
"aggs": {
"by_city": {
"terms": { "field": "city" }
}
}
}
{
"aggs": {
"by_day": {
"date_histogram": {
"field": "create_time",
"calendar_interval": "day"
}
}
}
}
{
"aggs": {
"age_range": {
"range": {
"field": "age",
"ranges": [
{ "to": 18 },
{ "from": 18, "to": 30 },
{ "from": 30 }
]
}
}
}
}
示例:每个城市的平均年龄
{
"aggs": {
"by_city": {
"terms": { "field": "city" },
"aggs": {
"avg_age": {
"avg": { "field": "age" }
}
}
}
}
}
{ "name": "Tom", "city": "Beijing", "age": 25 }
{ "name": "Lucy", "city": "Shanghai", "age": 30 }
{ "name": "Jack", "city": "Beijing", "age": 35 }
GET /user/_search
{
"size": 0,
"aggs": {
"by_city": {
"terms": { "field": "city" },
"aggs": {
"avg_age": { "avg": { "field": "age" } }
}
}
}
}
SearchSourceBuilder source = new SearchSourceBuilder();
TermsAggregationBuilder agg =
AggregationBuilders.terms("by_city").field("city");
agg.subAggregation(AggregationBuilders.avg("avg_age").field("age"));
source.aggregation(agg);
❗ text 字段不能直接聚合
✅ 用 keyword:
"city.keyword"
❗ 聚合字段要建索引
❗ 数据量大时注意 size 和性能
我可以直接帮你写聚合语句。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。