第六阶段 60 · Transform 数据透视(把明细汇总成实体索引

60 · Transform 数据透视(把明细汇总成实体索引)

阶段:第六阶段 / 进阶专题

ES:Transform(pivot / latest) | PostgreSQL:物化视图(MATERIALIZED VIEW)+ 定时刷新


1. 概念

明细索引(每笔销售一条)适合检索,但不适合反复做重聚合 (慢、耗资源)。

Transform 能把明细「透视」成一个新的汇总实体索引,例如:

  • 从「每笔订单」→ 汇总成「每个客户的总消费、订单数、最近下单时间」。
  • 结果写进一个新索引,之后直接查这个索引,秒回。

两种模式:

模式 作用 类比
pivot 按 group_by + 聚合,生成汇总行 GROUP BY 结果落表
latest 按 key 取每组最新一条 DISTINCT ON (key) ORDER BY time DESC

还能设 continuous(持续):源数据变了,自动增量更新目标索引 ------ 就是「自动刷新的物化视图」。


2. PostgreSQL 对照

sql 复制代码
-- 物化视图:把明细汇总成客户维度
CREATE MATERIALIZED VIEW customer_summary AS
SELECT customer_id,
       SUM(amount)  AS total_amount,
       COUNT(*)     AS order_cnt,
       MAX(order_dt) AS last_order_dt
FROM sales
GROUP BY customer_id;

REFRESH MATERIALIZED VIEW customer_summary;   -- 定时刷新

Transform(continuous)≈ 会自动增量刷新的物化视图。


3. ES DSL

3.1 pivot:客户维度汇总

复制代码
PUT _transform/customer_summary
{
  "source": { "index": "sales_idx" },
  "dest":   { "index": "customer_summary_idx" },
  "pivot": {
    "group_by": {
      "customer_id": { "terms": { "field": "customer_id" } }
    },
    "aggregations": {
      "total_amount":  { "sum": { "field": "amount" } },
      "order_cnt":     { "value_count": { "field": "order_no.keyword" } },
      "last_order_dt": { "max": { "field": "order_dt" } }
    }
  },
  "sync": {
    "time": { "field": "order_dt", "delay": "60s" }
  }
}
  • 有 sync = continuous,源变了自动增量更新目标索引。
  • 去掉 sync = 一次性批处理(batch)。

3.2 启动 / 停止 / 预览

复制代码
POST _transform/customer_summary/_start
POST _transform/customer_summary/_stop

// 建之前先预览结果长什么样
POST _transform/_preview
{ "source": { "index": "sales_idx" }, "pivot": { ...同上... } }

3.3 latest:每个客户最新一单

复制代码
PUT _transform/customer_latest
{
  "source": { "index": "sales_idx" },
  "dest":   { "index": "customer_latest_idx" },
  "latest": {
    "unique_key": ["customer_id"],
    "sort": "order_dt"
  }
}

4. Spring Boot 实现

java 复制代码
@Component
public class Doc60Transform {

    @Autowired
    private ElasticsearchClient elasticsearchClient;

    /** 创建并启动一个 pivot transform */
    public void createCustomerSummary() throws IOException {
        elasticsearchClient.transform().putTransform(t -> t
                .transformId("customer_summary")
                .source(src -> src.index("sales_idx"))
                .dest(d -> d.index("customer_summary_idx"))
                .pivot(p -> p
                    .groupBy("customer_id", g -> g.terms(tm -> tm.field("customer_id")))
                    .aggregations("total_amount", a -> a.sum(s -> s.field("amount")))
                    .aggregations("order_cnt",    a -> a.valueCount(v -> v.field("order_no.keyword")))
                    .aggregations("last_order_dt", a -> a.max(m -> m.field("order_dt"))))
                .sync(sy -> sy.time(ti -> ti.field("order_dt").delay(dl -> dl.time("60s")))));

        elasticsearchClient.transform().startTransform(s -> s.transformId("customer_summary"));
    }

    /** 停止 */
    public void stop() throws IOException {
        elasticsearchClient.transform().stopTransform(s -> s.transformId("customer_summary"));
    }
}

import:co.elastic.clients.elasticsearch.transform.*(PutTransformRequest 等由 builder 隐式使用)。


5. 坑与最佳实践

  1. 先 _preview 再落库:确认汇总字段和粒度对,再正式建,避免返工。
  2. continuous 要有时间字段 :sync.time.field 通常用 @timestamp / order_dt,delay 留出数据到达的缓冲。
  3. 目标索引是「派生数据」:别直接写它;它由 transform 维护,需要改逻辑就重建。
  4. group_by 的 text 字段用 .keyword:同 21/43 篇。
  5. 资源占用 :continuous transform 会持续跑,注意其对集群的负载,必要时调 frequency。
  6. 和聚合的取舍 :临时分析用聚合(20~24 篇);高频、固定维度的汇总查询才值得用 transform 预计算。

相关推荐
言午说数据21 分钟前
Paimon把LSM搬进湖里的得与失
大数据·后端
派小心.25 分钟前
网站统计多域名数据隔离配置
大数据·数据库·人工智能·小程序·数据分析
Rosanci29 分钟前
AI 办公助手该提醒谁、何时升级?从跨系统消息到可处理的待办
大数据·人工智能·ai 办公
wespaul1 小时前
VeapAI 自然语言操作实战|第 09 篇:收尾——六条原则与三条演进线
大数据·数据库·人工智能
anxiao_m1 小时前
数字孪生智慧城市怎么建?实时渲染平台选型要点
大数据·智慧城市·数字孪生
龙亘川1 小时前
健康服务规范化背后,数字化如何 “辅助赋能“
大数据·前端·人工智能·智慧城市·数据可视化
逸模1 小时前
主材偏差从 15% 降到 5%:连锁公装算量是怎么做到的
大数据·人工智能·施工·连锁公装·开店
data analyse 4561 小时前
SourceMap 上传版本与报错版本对不上?版本校验与错误还原设计
大数据·前端·人工智能·数据分析
Sayai2 小时前
Kafka 2.8→3.9.1 跨大版本升级实战:ZooKeeper 同步升级、数据目录迁移与回滚预案全流程
大数据·运维·分布式·zookeeper·kafka
howdoyoudo2026062 小时前
AI审计手记 #30:从“政府网站”到“商业平台”——腾讯云沙箱AI代理越界事件的审计分析
大数据·人工智能·安全·机器学习·语言模型·云计算·腾讯云