在 Elasticsearch 的高级功能中,enrich processor、cross-cluster search 和 transform 是三大核心组件,分别用于数据增强、跨集群查询和数据聚合透视(类似 ETL)。它们极大增强了 Elasticsearch 在复杂数据架构中的能力。
下面我们详细解析这三个功能的原理、使用场景和实战示例。
一、Enrich Processor(数据增强处理器)
1. 什么是 Enrich Processor?
Enrich processor 允许你在数据摄入阶段(Ingest Pipeline)将当前文档与另一个“参考数据集”进行“关联”(类似 SQL 的 JOIN),从而丰富文档内容。
类似于:根据 IP 地址补全地理位置信息。
2. 核心概念
- Enrich Policy(增强策略):定义从哪个索引中提取哪些字段,按什么字段匹配。
- Match Field:用于关联的字段(如
ip、category_id)。 - Enrich Index:存储参考数据的索引(必须是小而稳定的)。
- Pipeline 使用:在 ingest pipeline 中调用
enrich处理器完成字段补充。
3. 使用步骤
Step 1:准备参考数据(如地理位置)
PUT /ip-location
{
"mappings": {
"properties": {
"ip_range": { "type": "ip" },
"country": { "type": "keyword" },
"city": { "type": "keyword" }
}
}
}
# 插入参考数据
POST /ip-location/_doc
{
"ip_range": "192.168.1.1",
"country": "中国",
"city": "北京"
}
Step 2:创建 Enrich Policy
PUT /_enrich/policy/ip-location-policy
{
"match": {
"indices": "ip-location",
"match_field": "ip_range",
"enrich_fields": ["country", "city"]
}
}
Step 3:执行 policy(创建底层索引)
POST /_enrich/policy/ip-location-policy/_execute
Step 4:创建 Ingest Pipeline 使用 Enrich
PUT _ingest/pipeline/enrich-ip-info
{
"processors": [
{
"enrich": {
"policy_name": "ip-location-policy",
"field": "client_ip",
"target_field": "geo"
}
}
]
}
Step 5:写入日志,自动补全地理位置
PUT /logs/_doc/1?pipeline=enrich-ip-info
{
"client_ip": "192.168.1.1",
"action": "login"
}
结果文档:
{
"client_ip": "192.168.1.1",
"action": "login",
"geo": {
"country": "中国",
"city": "北京"
}
}
4. 支持的 Enrich 类型
| 类型 | 说明 |
|---|---|
match | 精确匹配字段(如 keyword) |
range | 范围匹配(如 IP 范围、数值区间) |
match_each | 字段是数组时,逐个匹配 |
示例:IP 范围匹配可使用
ip_range类型 +rangeenrich。
5. 适用场景
- 日志中 IP → 地理位置
- 商品类目 ID → 类目名称
- 用户 ID → 用户基本信息(如等级)
- 订单状态码 → 状态中文描述
6. 注意事项
- Enrich index 应小而稳定(< 100MB 推荐)。
- 不适合频繁更新的参考数据。
- 需要执行
_execute才生效。 - 支持跨集群 enrich(需配置 remote cluster)。
二、Cross-Cluster Search(跨集群搜索)
1. 什么是 Cross-Cluster Search?
允许你在一个 Elasticsearch 集群中,透明地查询其他远程集群的索引,实现数据联邦查询。
类似于:在“分析集群”中直接查询“日志集群”和“用户集群”的数据。
2. 架构图
Local Cluster (查询入口)
|
├── Remote Cluster A (logs-cluster)
├── Remote Cluster B (users-cluster)
└── Local Index
3. 配置步骤
Step 1:在本地集群配置远程集群
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"logs-cluster": {
"seeds": ["192.168.10.1:9300"]
},
"users-cluster": {
"seeds": ["192.168.10.2:9300"]
}
}
}
}
}
注意:使用 transport port(9300),不是 HTTP(9200)。
Step 2:验证连接
GET /_remote/info
Step 3:执行跨集群搜索
GET logs-cluster:server-logs-*/_search
{
"query": {
"match": {
"status": "error"
}
}
}
也可以联合本地 + 远程:
GET logs-cluster:server-logs-*,users-cluster:users/_search
{
"query": {
"match_all": {}
}
}
4. 高级功能
- Cross-Cluster Replication(CCR):将远程索引复制到本地,用于灾备或低延迟查询。
- Federated Aggregations:跨集群聚合(支持,但性能需评估)。
- 权限控制:通过 Role-Based Access Control(RBAC)限制用户可查的远程集群。
5. 适用场景
- 多数据中心架构
- 开发/测试环境查询生产数据(只读)
- 数据隔离但需联合分析(如日志 + 用户信息)
- 渐进式集群迁移
6. 注意事项
- 网络延迟影响性能。
- 不支持跨集群
join或parent-child。 - 建议使用专线或内网连接。
- 避免高频大范围扫描。
三、Transform(数据透视 / 聚合持久化)
1. 什么是 Transform?
Transform 可以将源索引的数据进行聚合、连接、转换,并将结果写入目标索引,实现类似 物化视图(Materialized View)或 ETL 作业。
类似于:每天统计每个用户的访问次数,生成汇总表。
2. 核心能力
- 支持
pivoted(行列转换)和latest(取最新文档)两种模式。 - 增量更新(基于
checkpoint)。 - 支持聚合:
sum、avg、cardinality、top_hits等。 - 可结合
pipeline进行后处理。
3. 使用示例:用户行为汇总
源数据:user-logs
{
"user_id": "u1",
"action": "click",
"timestamp": "2024-04-01T10:00:00Z"
}
目标:按用户聚合统计
{
"user_id": "u1",
"click_count": 15,
"last_seen": "2024-04-01T18:00:00Z"
}
Step 1:创建 Transform
PUT _transform/user-summary-transform
{
"source": {
"index": "user-logs"
},
"pivot": {
"group_by": {
"user_id": {
"terms": {
"field": "user_id"
}
}
},
"aggregations": {
"click_count": {
"value_count": {
"field": "action"
}
},
"last_seen": {
"max": {
"field": "timestamp"
}
}
}
},
"description": "每日用户行为汇总",
"dest": {
"index": "user-summary"
},
"frequency": "1h", // 每小时检查增量
"sync": {
"time": {
"field": "timestamp",
"delay": "60s"
}
}
}
Step 2:启动 Transform
POST _transform/user-summary-transform/_start
Step 3:查看状态
GET _transform/user-summary-transform/_stats
4. 两种模式对比
| 模式 | 说明 | 适用场景 |
|---|---|---|
pivoted | 聚合 + 分组,生成宽表 | 统计报表、Dashboard 数据源 |
latest | 按某字段取最新文档 | 同步最新状态(如用户资料) |
5. 适用场景
- 实时数仓:从原始日志生成汇总指标。
- 降频存储:冷热数据分离,原始数据保留 7 天,汇总数据保留 1 年。
- 异构数据整合:将多个索引聚合为一个分析视图。
- 机器学习输入:为 ML job 准备特征数据。
6. 注意事项
- Transform 是异步任务,有延迟(取决于
frequency)。 - 占用资源(CPU、内存),需监控。
- 支持 自动停止、错误重试、限速。
- 可与 Kibana Lens、ML Job 集成。
四、三者结合的典型架构示例
[ 日志集群 ] ←cross-cluster→ [ 分析集群 ]
↑
[ Enrich: IP → 地理位置 ]
↑
[ Transform: 生成用户画像 ]
↑
[ Ingest Pipeline: 清洗 + enrich ]
流程:
- 分析集群通过
cross-cluster search读取日志集群数据。 - 使用
enrich processor补全 IP 地理信息。 - 通过
transform按用户聚合行为数据。 - 最终生成可被 Kibana 可视化的用户行为报表。
五、总结对比
| 功能 | 用途 | 数据流向 | 是否持久化 |
|---|---|---|---|
| Enrich Processor | 写入时补充字段 | 摄入时增强 | 是(写入文档) |
| Cross-Cluster Search | 联合查询多个集群 | 查询时拉取 | 否(实时) |
| Transform | 聚合生成新索引 | 批量 ETL | 是(持久化结果) |
六、最佳实践建议
-
Enrich:
- 参考数据要小、稳定。
- 使用
keyword或ip类型做匹配字段。 - 定期重建 policy 以同步数据更新。
-
Cross-Cluster Search:
- 配置专用网络链路。
- 限制用户权限。
- 避免跨集群大范围扫描。
-
Transform:
- 合理设置
frequency和delay。 - 目标索引提前定义 Mapping。
- 监控任务延迟和资源使用。
- 合理设置
七、结语
这三大功能让 Elasticsearch 不再只是一个“搜索引擎”,而是演变为一个强大的分布式数据处理平台:
enrich让数据更完整;cross-cluster search让数据更联通;transform让数据更有价值。
合理组合使用,可构建出企业级的数据中台、日志分析系统、用户画像平台等复杂架构。
📌 扩展学习:
- Enrich + Pipeline 实现多层数据补全
- Transform 与 Machine Learning 集成
- CCS + Tribe Node(旧版)对比
- Rollup vs Transform

被折叠的 条评论
为什么被折叠?



