第三阶段 25 · nested 嵌套对象与查询(数组对象最大的坑)
25 · nested 嵌套对象与查询数组对象最大的坑阶段第三阶段 / 查询 聚合ESnested类型 nestedquery / agg | PostgreSQL一对多子表 JOIN / JSONB 数组1. 概念为什么普通对象数组会“串味”ES 默认把对象数组扁平化存储。假设一个订单里有多个明细{order_no:SO-1,items:[{sku:A,qty:10},{sku:B,qty:99}]}默认object类型ES 内部会拆成items.sku [A, B]、items.qty [10, 99]——字段间的对应关系丢了。于是你查「skuA 且 qty99」时会错误命中这条文档因为 A 在 sku 列里、99 在 qty 列里跨对象串味了。解决办法把items声明为nested。nested 会把数组里每个对象作为独立的隐藏子文档索引字段对应关系得以保留——概念上就像一张一对多子表。2. PostgreSQL 对照-- nested 约等于一对多子表 JOINSELECTo.*FROMorders oJOINorder_items iONi.order_noo.order_noWHEREi.skuAANDi.qty99;-- 条件作用在“同一行明细”上关键点nestedquery 的语义就是「同一个子对象内同时满足多个条件」对应 SQL 里条件落在 JOIN 后的同一行。3. ES DSL3.1 定义 nested 字段mappingPUT orders_idx { mappings: { properties: { order_no: { type: keyword }, items: { type: nested, properties: { sku: { type: keyword }, qty: { type: integer } } } } } }3.2 nested 查询同一子对象内满足多条件GET orders_idx/_search { query: { nested: { path: items, query: { bool: { filter: [ { term: { items.sku: A } }, { term: { items.qty: 99 } } ] } }, inner_hits: {} // 可选回传到底是哪个子对象命中的 } } }没有nested包裹时上面这组条件会串味误命中包了nested就只命中「同一条明细里 skuA 且 qty99」。3.3 nested 聚合先进子文档再聚合GET orders_idx/_search { size: 0, aggs: { items_agg: { nested: { path: items }, aggs: { by_sku: { terms: { field: items.sku }, aggs: { total_qty: { sum: { field: items.qty } } } } } } } }4. Spring Boot 实现ComponentpublicclassDoc25NestedQuery{AutowiredprivateElasticsearchClientelasticsearchClient;/** 同一条明细里 sku? 且 qty?并回传命中的子对象 */publicListMapString,ObjectbyItem(StringindexName,Stringsku,intqty)throwsIOException{SearchResponseMaprespelasticsearchClient.search(s-s.index(indexName).query(q-q.nested(n-n.path(items).query(nq-nq.bool(b-b.filter(f-f.term(t-t.field(items.sku).value(sku))).filter(f-f.term(t-t.field(items.qty).value(qty))))).innerHits(ih-ih))),// inner_hits拿到具体命中的子对象Map.class);returnresp.hits().hits().stream().map(Hit::source).filter(Objects::nonNull).collect(Collectors.toList());}}nested的path必须与 mapping 里的 nested 字段名一致子字段用「path.子字段」引用。inner_hits拿命中的子对象hit.innerHits().get(items).hits().hits()。5. 坑与最佳实践必须先在 mapping 里声明nested类型一旦建好不能从object原地改成nested需 reindex第 33 篇。查询/聚合都要用nested包裹直接term(items.sku)不会串味报错但语义错跨对象命中。nested 有成本每个子对象是独立 Lucene 文档数量大时占空间、变慢用index.mapping.nested_objects.limit兜底。数组内对象少而稳定才适合 nested关系复杂、需独立更新子项考虑 joinparent-child代价更高。inner_hits才能知道“哪条子对象命中”做高亮/回显时很有用。需要「独立文档的父子关系 / 跨文档关联 / 什么时候该反范式」见第 51 篇《join 父子关系与关系建模》。下一篇26-highlight-高亮.md。← 上一篇24-filter-bucket聚合 总览 下一篇26-highlight-高亮 →

相关新闻

微信内置浏览器UA解析:构建设备指纹库与前端兼容性实战指南

微信内置浏览器UA解析:构建设备指纹库与前端兼容性实战指南

1. 项目概述:一份微信内置浏览器的“设备指纹”档案如果你做过微信生态相关的开发,比如H5页面、微信小程序里的Webview组件,或者需要分析微信内网页的访问数据,那你一定对“微信内置浏览器”这个环境又爱又恨。爱的是它背后庞大的…

2026/10/11 15:41:21 阅读更多 →
Android短信链接唤起App全攻略:从Deep Link到App Link的实战避坑

Android短信链接唤起App全攻略:从Deep Link到App Link的实战避坑

1. 项目缘起:一个看似简单却暗藏玄机的需求最近在做一个金融类的App,产品经理提了个需求,说希望用户在收到营销短信后,点击里面的链接,能直接跳转到我们App的某个特定页面,比如一个活动详情页或者一个新用户…

2026/9/28 19:11:35 阅读更多 →
AI模型灰度发布与工程实践:从Claude Fable 5看大模型交付策略

AI模型灰度发布与工程实践:从Claude Fable 5看大模型交付策略

1. 从“Fable”到“分批上线”:一次模型发布策略的深度拆解 最近,关于Claude Fable 5即将“分批重新上线”的消息,在AI社区里激起了不小的水花。如果你也和我一样,每天泡在各大技术论坛和开发者社群里,会发现一个有趣的…

2026/10/11 6:21:53 阅读更多 →

最新新闻

YOLOv5工地安全帽识别实战:从源码拆解到训练推理全流程

YOLOv5工地安全帽识别实战:从源码拆解到训练推理全流程

简介:本资源面向计算机视觉入门与进阶开发者,提供一套基于YOLOv5的工地安全监控实战项目,重点解决安全帽佩戴检测与禁入危险区域识别两类问题,适合希望掌握目标检测落地流程、积累项目经验的学生与工程师。压缩包共61个文件&#…

2026/10/11 20:27:15 阅读更多 →
TensorFlow+OpenCV实战:人脸识别与表情识别CNN全流程

TensorFlow+OpenCV实战:人脸识别与表情识别CNN全流程

简介:本资源面向计算机视觉入门与进阶开发者,提供一套基于TensorFlow与OpenCV的人脸识别与表情识别完整项目方案,可用于安全监控、人机交互等场景的学习与二次开发。项目围绕人脸检测、特征提取与七类基本表情分类展开,涉及MTCNN、…

2026/10/11 20:27:15 阅读更多 →
MySQL实用基础:建表、索引、SQL、事务、备份与排查

MySQL实用基础:建表、索引、SQL、事务、备份与排查

做了这么多年数据相关工作,接触过的数据库不少,但兜兜转转,MySQL始终是绕不开的那个。后台服务、管理系统、中台业务、数据分析平台的底层存储,大半都能看到它的身影。网上讲MySQL的教程铺天盖地,但多数要么停留在安装…

2026/10/11 20:27:15 阅读更多 →
基于YOLOv8的基建裂缝检测系统:从环境搭建到模型调优的完整实战指南

基于YOLOv8的基建裂缝检测系统:从环境搭建到模型调优的完整实战指南

简介:这份资源是面向计算机、电子信息等专业学生与项目实战学习者的YOLOv8基建裂缝目标检测完整项目包,可直接用于毕业设计、课程设计或期末大作业。项目经导师指导并通过评审,获得98分,具备较高的参考与借鉴价值。压缩包共848个文…

2026/10/11 20:27:15 阅读更多 →
深度学习皮肤病识别系统:从迁移学习到PyTorch部署全指南

深度学习皮肤病识别系统:从迁移学习到PyTorch部署全指南

简介:一份基于深度学习的皮肤病识别系统完整项目,面向毕业设计、课程设计与期末大作业场景,适合需要快速搭建图像识别应用的开发者。项目以CNN为特征提取基础,结合YOLO目标检测思路,覆盖数据准备、模型训练、服务端推理…

2026/10/11 20:27:15 阅读更多 →
Outlook非Exchange邮箱自动配置:Autodiscover协议实战指南

Outlook非Exchange邮箱自动配置:Autodiscover协议实战指南

简介:本资源面向企业IT支持人员、非Exchange邮箱用户及Outlook初学者,解决非微软Exchange环境下的Outlook客户端手动配置难题——绕过不可用的Autodiscover服务,实现POP3/IMAP邮箱的稳定接入。压缩包仅2KB,含2个核心文件&#xff…

2026/10/11 20:26:14 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →