ElasticSearch 聚合查询(2)桶聚合学习

本文深入解析Elasticsearch中的TermsAggregation、filterAggregation、RangeAggregation等聚合查询技术,通过具体示例展示了如何根据字段值项、过滤条件及数值范围进行高效的数据分组与统计。
1. Terms Aggregation 根据字段值项分组聚合
GET /megacorp/employee/_search?size=0 HTTP/1.1
Host: 192.168.31.233:9200
Content-Type: application/json

{
    "aggs": {
        "age_terms": {
            "terms": {
                "field": "age"
            }
        }
    }
}

Results:

{
    "took": 42,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 7,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "age_terms": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 35,
                    "doc_count": 3
                },
                {
                    "key": 25,
                    "doc_count": 2
                },
                {
                    "key": 32,
                    "doc_count": 2
                }
            ]
        }
    }
}

结果说明:

“doc_count_error_upper_bound”: 0:文档计数的最大偏差值

“sum_other_doc_count”: 463:未返回的其他项的文档数

默认情况下返回按文档计数从高到低的前10个分组:

2. filter Aggregation 对满足过滤查询的文档进行聚合计算
POST /megacorp/employee/_search?size=0
{
  "aggs": {
    "age_terms": {
      "filter": {"match":{"gender":"F"}},
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}
3. Range Aggregation 范围分组聚合
GET /megacorp/employee/_search?size=0 HTTP/1.1
Host: 192.168.31.233:9200
Content-Type: application/json

{
    "aggs": {
        "age_range": {
            "range": {
                "field": "age",
                "ranges": [
                    {
                        "to": 25
                    },
                    {
                        "from": 25,
                        "to": 35
                    },
                    {
                        "from": 35
                    }
                ]
            }
        }
    }
}

Results:

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 7,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "age_range": {
            "buckets": [
                {
                    "key": "*-25.0",
                    "to": 25.0,
                    "doc_count": 0
                },
                {
                    "key": "25.0-35.0",
                    "from": 25.0,
                    "to": 35.0,
                    "doc_count": 4
                },
                {
                    "key": "35.0-*",
                    "from": 35.0,
                    "doc_count": 3
                }
            ]
        }
    }
}
5. Date Range Aggregation 时间范围分组聚合
6. Date Histogram Aggregation 时间直方图(柱状)聚合
7. Missing Aggregation 缺失值的桶聚合
8. Geo Distance Aggregation 地理距离分区聚合

参考官网链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geodistance-aggregation.html

<think> 嗯,用户想了解IT领域中"aggregate"的含义和应用,特别提到了数据库聚合操作和编程聚合函数。结合之前的引用,用户似乎对DDD中的聚合概念也有一定兴趣,但当前问题更偏向技术实现层面。 用户可能是个开发者或数据工程师,正在解决具体的技术问题。从ta明确提到数据库和编程函数来看,需求很聚焦,需要避免过多展开DDD理论。不过引用[1]提到的"聚合-Aggregate"是领域驱动设计的重要概念,可以简要关联说明。 数据库方面需要覆盖SQL标准聚合函数(COUNT/SUM等)和MongoDB的聚合管道这类典型应用;编程部分则重点解释函数式编程的reduce操作和面向对象的聚集关系。对于分布式场景,MapReduce的聚合机制也值得提及——这和用户引用的"大数据工程师"背景相关。 要注意区分不同语境下"聚合"的含义:在SQL中是计算操作,在DDD中是领域对象封装,在UML中表示对象关联。虽然都叫aggregate,但内涵不同。最后用医院管理系统的例子串联这些概念,既能呼应引用[3]的医疗场景,又直观展示技术应用。 </think> 在IT领域,"aggregate"(聚合)是一个多语境的核心概念,主要涵盖以下技术场景和应用: --- ### 一、数据库中的聚合操作 **含义**:对数据集执行计算并返回单一统计值的操作 **典型函数**: - `COUNT()`:统计行数(`SELECT COUNT(*) FROM orders;`) - `SUM()`:数值求和(`SELECT SUM(revenue) FROM sales;`) - `AVG()`:计算平均值(`SELECT AVG(rating) FROM reviews;`) - `MAX()`/`MIN()`:获取极值(`SELECT MAX(temperature) FROM sensors;`) **应用场景**: - 生成业务报表(如月销售额统计) - 数据摘要分析(用户行为指标计算) - 配合`GROUP BY`实现分组聚合(按部门统计平均薪资) --- ### 二、编程中的聚合函数 **1. 函数式编程** - **Reduce操作**:将集合元素迭代合并为单一结果 ```python # Python示例:计算乘积 from functools import reduce reduce(lambda x, y: x * y, [1, 2, 3, 4]) # 输出 24 ``` **2. 面向对象编程** - **聚集关系(Aggregation)**:表示"整体-部分"关系,部分可独立存在 ```java // Java示例:汽车与车轮 class Wheel { /* 属性 */ } class Car { private List<Wheel> wheels; // 聚合关系 } ``` --- ### 三、领域驱动设计(DDD)中的聚合 **含义**:将关联实体与值对象封装为业务逻辑单元(引用[1]的"聚合-Aggregate")[^1] **核心规则**: - 聚合根(Aggregate Root)是唯一访问入口 - 跨聚合引用通过ID而非直接对象引用 - 事务边界限定在单个聚合内 **应用场景**: - 电商系统的`Order`聚合(含OrderItem值对象) - 银行系统的`Account`聚合(含交易记录实体) --- ### 四、分布式系统中的聚合 **1. MapReduce模型** - **Map阶段**:分布式处理原始数据 - **Reduce阶段**:聚合各节点计算结果 ```plaintext 示例:词频统计 Input -> Map("hello:1", "world:1", "hello:1") -> Reduce("hello:2", "world:1") ``` **2. 流处理引擎** - **窗口聚合**:按时间/数量窗口实时计算指标(如Flink/Kafka Streams) ```sql -- SQL示例:5分钟滚动平均温度 SELECT AVG(temp) FROM sensor_stream GROUP BY TUMBLE(5 MINUTE) ``` --- ### 五、典型应用案例 1. **医疗大数据分析**(引用[3])[^3] - 聚合电子病历与基因数据,生成疾病风险预测模型 - 实时聚合ICU设备数据,触发临床预警 2. **旅游大数据平台**(引用[2])[^2] - 聚合用户行为日志,生成个性化推荐 - 实时聚合机票价格波动,动态调整营销策略 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值