发布时间:2026/8/4 18:39:52
第六阶段 51 · join 父子关系与关系建模(ES 里怎么做 JOIN) 51 · join 父子关系与关系建模ES 里怎么做 JOIN阶段第六阶段 / 进阶专题ESjoin字段 has_child/has_parent、反范式、terms lookup、enrich | PostgreSQLJOIN、表继承、物化视图1. 概念ES 没有真正的跨索引 JOIN这是从 PG 转过来最需要转变的观念ES 不擅长 JOIN它鼓励“用存储换查询速度”。处理关系有四条路线按推荐度方案关系落在哪适合代价反范式冗余首选写入时拍平进一篇文档关系简单、读多写少数据冗余、更新要同步nested第 25 篇同一篇文档内的数组对象主文档有限明细一起读写子项更新要重索引整篇join父子同一索引里的独立父/子文档子项需独立频繁更新、一对多量大慢、吃内存、不能跨索引terms lookup / enrich查询时/写入时做轻量关联用维表补字段有限场景一句话能反范式就别 join。join/nested 是不得已才用。2. PostgreSQL 对照-- PG跨表 JOIN 很自然SELECTo.*,c.nameFROMorders oJOINcustomers cONc.ido.customer_id;-- PG 表继承父子CREATETABLEbase_event(...);CREATETABLEclick_event()INHERITS(base_event);ES 对应跨表 JOIN →反范式把customer_name写进 order 文档或 enrich。表继承/父子 →join字段同一索引里父子文档。3.join字段父子关系3.1 mapping声明父子关系PUT orders_idx { mappings: { properties: { my_join: { type: join, relations: { order: item } // order 是父item 是子 }, order_no: { type: keyword }, sku: { type: keyword }, qty: { type: integer } } } }3.2 写入父、写入子子必须带 routing 父ID保证同分片# 父文档 PUT orders_idx/_doc/order-1 { order_no: SO-1, my_join: order } # 子文档routing 指向父parent 指定父ID PUT orders_idx/_doc/item-1?routingorder-1 { sku: A, qty: 10, my_join: { name: item, parent: order-1 } }3.3 查询has_child / has_parent# 找“包含 skuA 子项”的父订单 GET orders_idx/_search { query: { has_child: { type: item, query: { term: { sku: A } }, inner_hits: {} // 可选带出命中的子文档 } } } # 反过来找某父订单下的所有子项 GET orders_idx/_search { query: { has_parent: { parent_type: order, query: { term: { order_no: SO-1 } } } } }4. Spring Boot 实现ComponentpublicclassDoc51Join{AutowiredprivateElasticsearchClientelasticsearchClient;/** has_child找包含指定 sku 子项的父订单 */publicListMapString,ObjectparentsHavingSku(StringindexName,Stringsku)throwsIOException{SearchResponseMaprespelasticsearchClient.search(s-s.index(indexName).query(q-q.hasChild(hc-hc.type(item).query(cq-cq.term(t-t.field(sku).value(sku))).scoreMode(ChildScoreMode.None)// 不需要子分影响父分.innerHits(ih-ih))),// 带出命中的子文档Map.class);returnresp.hits().hits().stream().map(Hit::source).filter(Objects::nonNull).collect(Collectors.toList());}/** 写子文档必须带 routing 父ID */publicvoidindexChild(StringindexName,StringchildId,StringparentId,MapString,ObjectchildDoc)throwsIOException{childDoc.put(my_join,Map.of(name,item,parent,parentId));elasticsearchClient.index(i-i.index(indexName).id(childId).routing(parentId)// ★ 关键与父同分片.document(childDoc));}}importco.elastic.clients.elasticsearch._types.query_dsl.ChildScoreMode。子文档写入/查询/删除都要带routing父ID否则找不到或落错分片。5. 反范式与轻量关联更推荐的日常做法5.1 反范式首选写入时就把维表字段冗余进主文档查询零 join// order 文档直接带上客户名而不是只存 customer_id 再去 join{order_no:SO-1,customer_id:C9,customer_name:Acme,amount:1000}维表变了要同步更新冗余字段用_update_by_query第 32 篇。读多写少时这笔账很划算。5.2 terms lookup用一篇文档的值去过滤GET orders_idx/_search { query: { terms: { customer_id: { index: vip_customers, id: batch-1, path: ids // 取那篇文档的 ids 数组做 IN } } } }5.3 enrich processor写入时自动补字段在 ingest pipeline 里配 enrich policy把维表字段在写入时自动拼进文档——相当于 ETL 的 lookup join查询时就是普通字段。6. 坑与最佳实践join父子必须同索引、同分片靠routing父ID保证不能跨索引 join。父子有性能代价has_child/has_parent比普通查询慢、更吃内存量大时评估。一个索引里 join 关系尽量单一多级/多种父子会让维护和性能雪上加霜。优先反范式ES 是查询引擎不是关系库能冗余拍平就别上 join/nested。nested vs join 选型明细跟主文档一起读写 →nested子项要独立高频更新 →join。更新冗余字段用_update_by_query维表变更后批量刷新被冗余的字段。相关文档内数组对象25-nested-嵌套对象与查询.md批量刷新冗余字段32-update_by_query-delete_by_query.md索引重建改关系模型33-index-mapping-管理.md

相关新闻

2026/8/4 18:39:52

半导体精密蚀刻温控设备怎么选?阿尔西全工艺产品矩阵盘点

精密蚀刻温控是半导体制造、医疗影像诊断、数据中心及电信基础设施等高科技领域的关键支撑技术。蚀刻温控系统通过精确管理工艺设备的发热与散热过程,确保温度波动控制在极窄范围内,从而保障产品良率、设备稳定运行及能源利用效率。阿尔西集团&#xff0…

2026/8/4 19:24:55

STM32不使用的IO硬件要怎么处理

未使用的IO口千万别悬空‌,最稳妥的做法是‌配置为模拟输入模式‌,这样既能省电又能抗干扰。‌‌‌🎯 怎么配最省电 ‌模拟输入模式是首选‌,它会关闭数字输入缓冲器和施密特触发器,禁用内部上下拉电阻,漏电…

2026/8/4 19:24:55

5分钟搭建原神私服:KCN-GenshinServer图形化一键服务端终极指南

5分钟搭建原神私服:KCN-GenshinServer图形化一键服务端终极指南 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 你是否梦想拥有一个完全由自己掌控的提瓦特大陆…

2026/8/4 19:24:55

CTFshow WEB12 SSTI漏洞解析与实战利用

1. CTFshow WEB12题目解析与解题思路WEB12是CTFshow平台上的一道典型Web安全挑战题,考察选手对服务器端漏洞的识别和利用能力。这道题目的核心在于通过精心构造的输入绕过服务端的安全防护,最终获取到隐藏的flag。从题目名称和编号来看,这应该…

2026/8/4 19:24:55

国产GPU运维:监控告警与性能调优实战

1. 国产GPU信创适配运维体系概述在信息技术应用创新产业快速发展的背景下,国产GPU的规模化应用已成为行业趋势。与传统商用GPU不同,国产GPU在架构设计、驱动生态和性能特征上具有独特性,这对运维体系提出了全新挑战。我们团队在过去三年中&am…

2026/8/3 21:14:30

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/4 0:02:01

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/3 22:40:58

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/3 13:26:41

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/3 16:43:13

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…