第六阶段 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_dtdelay 留出数据到达的缓冲。
  3. 目标索引是「派生数据」:别直接写它;它由 transform 维护,需要改逻辑就重建。
  4. group_bytext 字段用 .keyword:同 21/43 篇。
  5. 资源占用 :continuous transform 会持续跑,注意其对集群的负载,必要时调 frequency
  6. 和聚合的取舍 :临时分析用聚合(20~24 篇);高频、固定维度的汇总查询才值得用 transform 预计算。

相关推荐
bransyin8 小时前
一个 SQL 字段到底是怎么算出来的?我做了一个能给出“证据”的血缘工具
大数据·sql·ai·血缘
AC赳赳老秦9 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
starzy199011 小时前
SparkSQL 数据源与底层架构深度剖析
大数据·分布式·架构·spark
Elastic 中国社区官方博客12 小时前
你的 AI agent 不需要你的 API 密钥:使用 OAuth 2.1 对 Elasticsearch MCP 服务器进行身份验证
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索
龙亘川15 小时前
综合执法一体化数字管控平台介绍
大数据·人工智能·安全·智慧城市
Json____15 小时前
五金制品行业-企业官网源码
java·大数据·数据库·企业站·wwwoop.com
黄焖鸡能干四碗16 小时前
信息安全保障方案(Word文件)
大数据·网络·人工智能·架构·区块链
大东(AIP内容运营专员)17 小时前
我用 OPC 模式运营一年多的AI产品
大数据·人工智能
互联网中的一颗神经元17 小时前
ZZ — Git 速查表
大数据·git·elasticsearch