第三阶段 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/8/2 9:27:10 阅读更多 →
Android短信链接唤起App全攻略:从Deep Link到App Link的实战避坑

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

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

2026/8/2 9:27:10 阅读更多 →
AI模型灰度发布与工程实践:从Claude Fable 5看大模型交付策略

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

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

2026/8/2 9:26:10 阅读更多 →

最新新闻

贝叶斯神经网络:从不确定性量化到PyTorch实战

贝叶斯神经网络:从不确定性量化到PyTorch实战

1. 项目概述:从确定性到不确定性的思维跃迁在深度学习的浪潮里,我们习惯了构建一个又一个“黑箱”模型:输入数据,模型给出一个确定的预测值。无论是图像分类的类别概率,还是回归预测的具体数值,传统神经网络…

2026/8/2 10:07:27 阅读更多 →
电竞选手形象塑造:从Bin的案例看团队话语权与舆论标签的博弈

电竞选手形象塑造:从Bin的案例看团队话语权与舆论标签的博弈

在电竞圈,选手的性格与团队氛围一直是粉丝和观众津津乐道的话题。近期,关于BLG上单选手Bin(陈泽彬)在RNG时期“脾气差”的传闻再次被提及,而前RNG教练朱开(KenZhu)在直播中的一番回忆&#xff0…

2026/8/2 10:07:27 阅读更多 →
Unity XR开发与性能优化实战:官方电子书资源深度解析与应用指南

Unity XR开发与性能优化实战:官方电子书资源深度解析与应用指南

1. 项目概述:为什么Unity开发者需要一本“实战指南”? 如果你是一名Unity开发者,无论是刚入门的新手,还是已经摸爬滚打几年的熟手,我相信你都经历过这样的时刻:面对一个复杂的性能问题,比如VR场…

2026/8/2 10:07:27 阅读更多 →
10.2英寸电子墨水屏驱动开发全攻略:从SPI连接到局部刷新与低功耗优化

10.2英寸电子墨水屏驱动开发全攻略:从SPI连接到局部刷新与低功耗优化

1. 项目概述:10.2英寸电子墨水屏HAT (G) 是什么?如果你玩过树莓派、Arduino或者ESP32,肯定对那种小小的黑白墨水屏不陌生,用来显示个天气、做个桌面时钟,小巧又省电。但今天要聊的这块屏,绝对算是个“大家伙…

2026/8/2 10:07:27 阅读更多 →
Spring Boot集成MinIO实现文件永久访问:从临时链接到稳定服务

Spring Boot集成MinIO实现文件永久访问:从临时链接到稳定服务

1. 从“临时链接”到“永久访问”:为什么我们需要重新思考文件服务 在任何一个需要处理用户上传文件的Web应用里,文件存储和访问都是绕不开的基础设施。很多开发者,尤其是刚接触Spring Boot生态的朋友,可能会觉得这很简单&#xf…

2026/8/2 10:07:26 阅读更多 →
SenseCAP Indicator Matter开发板实战:从环境搭建到应用开发全解析

SenseCAP Indicator Matter开发板实战:从环境搭建到应用开发全解析

1. 从硬件到生态:为什么选择 SenseCAP Indicator 作为 Matter 开发板如果你最近在关注智能家居开发,尤其是 Matter 协议,那么“SenseCAP Indicator”这个名字大概率已经出现在你的视野里了。它不仅仅是一块开发板,更是一个为 Matt…

2026/8/2 10:06:26 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →