【Elasticsearch】映射:Nested 类型
映射:Nested 类型
- 1.为什么需要 Nested 类型
- 2.如何定义 Nested 类型
- 3.相关操作
- 3.1 索引包含 Nested 数据的文档
- 3.2 查询 Nested 数据
- 3.3 聚合 Nested 数据
- 3.4 排序 Nested 数据
- 3.5 更新 Nested 文档中的特定元素
- 4.Nested 类型的高级操作
- 4.1 内嵌 inner hits
- 4.2 多级嵌套
- 5.注意事项
Nested(嵌套)类型是 Elasticsearch 中一种特殊的数据类型,用于处理 对象数组(object arrays
)中对象的独立性。在默认情况下,Elasticsearch 会将对象数组 扁平化(flattened
),这会导致 数组内对象之间的关联丢失。Nested 类型解决了这个问题,它使数组中的每个对象被独立索引和查询。
1.为什么需要 Nested 类型
考虑以下文档结构:
{"user": "John","comments": [{"text": "Great product!","votes": 5},{"text": "Terrible experience","votes": 1}]
}
默认情况下(使用 object
类型)查询 text 包含 Great,且 votes 等于 1
会错误地匹配这个文档,因为 Elasticsearch 将数组扁平化为:
comments.text: ["Great product!", "Terrible experience"]
comments.votes: [5, 1]
使用 nested
类型可以保持数组内对象的独立性。
2.如何定义 Nested 类型
在映射中明确声明字段为 nested
类型:
PUT /my_index
{"mappings": {"properties": {"comments": {"type": "nested", "properties": {"text": { "type": "text" },"votes": { "type": "integer" }}}}}
}
3.相关操作
3.1 索引包含 Nested 数据的文档
PUT /my_index/_doc/1
{"user": "John","comments": [{"text": "Great product!","votes": 5},{"text": "Terrible experience","votes": 1}]
}
3.2 查询 Nested 数据
使用 nested
查询来查询嵌套对象:
GET /my_index/_search
{"query": {"nested": {"path": "comments","query": {"bool": {"must": [{ "match": { "comments.text": "Great" } },{ "range": { "comments.votes": { "gte": 5 } } }]}}}}
}
3.3 聚合 Nested 数据
使用 nested
聚合分析嵌套字段:
GET /my_index/_search
{"aggs": {"comments_agg": {"nested": {"path": "comments"},"aggs": {"avg_votes": {"avg": { "field": "comments.votes" }}}}}
}
3.4 排序 Nested 数据
使用 nested
排序:
GET /my_index/_search
{"sort": [{"comments.votes": {"order": "desc","nested": {"path": "comments"}}}]
}
3.5 更新 Nested 文档中的特定元素
需要使用脚本更新:
POST /my_index/_update/1
{"script": {"source": """if (ctx._source.comments != null) {for (int i = 0; i < ctx._source.comments.size(); i++) {if (ctx._source.comments[i].text == 'Great product!') {ctx._source.comments[i].votes++;}}}"""}
}
返回结果说明如下:
核心字段
字段 含义 _index
文档所属的索引名称(这里是 "my_index"
)。_type
文档类型(Elasticsearch 7.x 后默认为 "_doc"
,表示单类型索引)。_id
被更新文档的唯一 ID(这里是 "1"
)。_version
文档的当前版本号(从 1
变为2
,表示这是第二次修改)。result
操作结果( "updated"
表示文档已成功更新)。
分片信息(
_shards
)
字段 含义 total
需要更新的分片总数(主分片 + 副本分片,这里是 2
)。successful
成功更新的分片数(这里是 2
,表示主分片和副本分片均更新成功)。failed
更新失败的分片数(这里是 0
,表示无失败)。
- 如果集群有副本分片,
total
可能大于1
(例如主分片 + 1个副本 =2
)。- 若
failed > 0
,需检查集群健康状态或分片分配问题。
并发控制字段
字段 含义 _seq_no
序列号(Sequence Number),用于乐观并发控制(每次修改递增)。 _primary_term
主分片任期(Primary Term),用于区分主分片是否发生过切换(如节点重启)。
- 这两个字段可用于实现 乐观锁(Optimistic Concurrency Control)。
- 例如,下次更新时可通过指定
if_seq_no
和if_primary_term
避免并发冲突。
业务含义总结
- 文档更新成功:
- 版本号
_version
从1
变为2
,说明这是对文档的第二次修改。result: "updated"
确认了更新操作已生效(如果是首次创建,会返回"created"
)。- 集群状态健康:
- 所有分片(
total: 2
)均成功更新(successful: 2
),无失败(failed: 0
)。- 后续操作依据:
_seq_no
和_primary_term
可用于后续的并发更新控制。
常见问题
- 如果
result
是noop
:表示脚本执行后未实际修改文档(例如条件不满足或值未变化)。- 如果
failed > 0
:需检查副本分片是否不可用(如节点宕机或网络问题)。
如果需要进一步验证更新内容,可以通过 GET /my_index/_doc/1
查询文档最新状态。
4.Nested 类型的高级操作
4.1 内嵌 inner hits
🚀
inner_hits
是 Elasticsearch 中的一个功能,它允许你在查询嵌套对象或父子文档时,获取匹配的内部嵌套结果或子文档的详细信息。
获取匹配的嵌套对象详情:
GET /my_index/_search
{"query": {"nested": {"path": "comments","query": {"match": { "comments.text": "product" }},"inner_hits": {}}}
}
4.2 多级嵌套
Elasticsearch 支持多级嵌套,但要注意性能影响:
PUT /my_index
{"mappings": {"properties": {"users": {"type": "nested","properties": {"name": { "type": "text" },"comments": {"type": "nested","properties": {"text": { "type": "text" },"votes": { "type": "integer" }}}}}}}
}
5.注意事项
- 性能考虑
- Nested 文档会作为独立文档索引,增加索引大小
- 查询
nested
字段比普通字段更耗资源 - 避免过度嵌套(通常不超过 2 2 2 级)
- 限制
- 一个索引默认最多包含 50 50 50 个
nested
字段(index.mapping.nested_fields.limit
) - 一个文档中所有
nested
对象数默认不超过 10000 10000 10000 个(index.mapping.nested_objects.limit
)
- 一个索引默认最多包含 50 50 50 个
- 与父子文档对比
- Nested 适合小规模、紧密关联的数据
- 父子文档(
join
类型)适合大规模、松散关联的数据
- 更新开销
- 更新父文档会替换整个
nested
数组 - 频繁更新
nested
字段会影响性能
- 更新父文档会替换整个
- 查询特殊性
- 必须使用
nested
查询来查询nested
字段 - 普通查询无法正确匹配
nested
对象间的关系
- 必须使用
通过合理使用 nested
类型,可以准确建模和查询复杂的一对多关系数据,但要注意其对性能的影响。
相关文章:

【Elasticsearch】映射:Nested 类型
映射:Nested 类型 1.为什么需要 Nested 类型2.如何定义 Nested 类型3.相关操作3.1 索引包含 Nested 数据的文档3.2 查询 Nested 数据3.3 聚合 Nested 数据3.4 排序 Nested 数据3.5 更新 Nested 文档中的特定元素 4.Nested 类型的高级操作4.1 内嵌 inner hits4.2 多级…...

Vue3 + UniApp 蓝牙连接与数据发送(稳定版)
本教程适用于使用 uni-app Vue3 (script setup) 开发的跨平台 App(支持微信小程序、H5、Android/iOS 等) 🎯 功能目标 ✅ 获取蓝牙权限✅ 扫描周围蓝牙设备✅ 连接指定蓝牙设备✅ 获取服务和特征值✅ 向设备发送数据包(ArrayBu…...

三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较
最近准备读写传统xls格式文件,而不是较新的xlsx,询问DeepSeek有哪些开源库,他给出了如下的简介和建议,还给出了相应链接,不过有的链接已失效。最后还不忘提醒,现在该用xlsx格式了。 以下是几个可以处理传统…...

Nature子刊同款的宏基因组免疫球蛋白测序怎么做?
免疫球蛋白A(IgA)是人体肠道黏膜分泌的主要抗体,它在塑造肠道微生物群落和维持肠道稳态中起着关键作用,有研究发现缺乏IgA的患者更容易患自身免疫性疾病和感染性疾病。 目前用于研究IgA结合的主要技术是IgA-SEQ,结合了…...

2025年牛客网秋招/社招高质量 Java 面试八股文整理
Java 面试 不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的。关键在于理解企业的需求,明确自己的定位,以及掌握一定的应试技巧。 笔试部分,通常是对基础知识、…...

ADI的BF609双核DSP怎么做开发,我来说一说(五)LAN口测试
作者的话 ADI的双核DSP,第二颗是Blackfin系列的BF609,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。 硬件准备 ADSP-BF609-CORE:ADI BF609开发板 产品链接:https://item.taobao.com/item.htm?…...

行业赋能篇-2-能源行业安全运维升级
在能源行业,尤其是风电领域,运维作业往往面临“三高”挑战——高风险环境、高异构数据量)、高合规要求。以海上风电场为例,传统运维依赖卫星电话沟通,数据记录碎片化,故障因信息传递延迟导致损失扩大。如何…...

飞云智能波段主图+多空短线决策副图指标,组合操盘技术图文解说
如上图,组合指标:主图-飞云智能波段,红线上红色K线标记,波段做多.副图指标-多空短线决策,跟踪做短线,红柱做多,绿柱短线卖出或做空。 实战操作中,我们在主图红色线支撑上红色K线出现…...

【51单片机】1. 基础点灯大师
1. 新建一个项目集一些基本操作 打开Keli软件,然后: 【Project】→【new μVision Project】→选择项目保存位置 建议文件名选一些通用的名字,如【Project】 左下角选择【Atmel】的【AT89C52】 弹出的【是否添加启动文件到文件夹下】&…...
RNN和CNN使用场景区别
RNN(循环神经网络)和 CNN(卷积神经网络)是深度学习中两种核心架构,它们的使用场景主要取决于数据结构和任务需求。以下是两者的关键区别及典型应用场景: 核心差异对比 维度RNN(循环神经网络&a…...

PC端直接打印功能(包括两张图片合并功能)
一、 效果图 二、demo代码 <template><div class"box"><divref"printContent"class"print-content"><div class"print-title">打印图片</div><imgclass"preview-image":src"merged…...

Vue前端篇——项目目录结构介绍
📘 前言 在正式开始学习 Vue 3 开发之前,了解并熟悉其项目目录结构是非常关键的第一步。一个清晰、规范的目录结构不仅有助于开发者高效地组织代码,还能显著提升项目的可读性和可维护性。 Vue 3 作为现代前端开发中广泛使用的主流框架之一&…...
基于端到端深度学习模型的语音控制人机交互系统
基于端到端深度学习模型的语音控制人机交互系统 摘要 本文设计并实现了一个基于端到端深度学习模型的人机交互系统,通过语音指令控制其他设备的程序运行,并将程序运行结果通过语音合成方式反馈给用户。系统采用Python语言开发,使用PyTorch框架实现端到端的语音识别(ASR)…...
原生js操作元素类名(classList,classList.add...)
1、classList classList属性是一个只读属性,返回元素的类名,作为一个DOMTokenList集合(用于在元素中添加,移除及切换css类) length:返回类列表中类的数量,该属性是只读的 <style> .lis { width: 200px; …...

抽象工厂模式深度解析:从原理到与应用实战
作者简介 我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与…...

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
江科大学长又发布了第二期的编写技巧! 大家可以看看:https://space.bilibili.com/383400717 最后面给了一个未完成的任务: 这里我已经把这个问题给解决了! 总代码放在资源里面,key.c放在文章最后面!同时感…...

Linux常用命令学习手册
Linux常用命令学习手册https://download.csdn.net/download/2401_87690752/90953550 《Linux常用命令学习手册》提供了一份实用的Linux操作指南,主要收录了系统管理和文件操作等基础命令。内容涵盖了目录切换、文件查看、权限设置等核心功能,适合Linux初…...

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解
在现代 Web 应用中,异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加-CSDN博客,深入解析 AI 对话框页面中异步逻辑的…...

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
文章目录 前言:准备工作UE4 vs UE5 性能对比引擎核心技术方案对比UE5 优化总结项目设置可伸缩性组设置VolumetricCloud最后前言: 最近在使用UE5制作VR项目 制作完后发现,我们的场景一直很卡顿,场景优化也做到了极致,但是帧率最高也才30+ 但是我们看到一个竞品,他的帧率竟…...

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
关键词:MATLAB,电学层析成像,人工智能,图像重建,深度学习 一、引言 基于人工智能的电学层析成像系统是一种创新的检测技术,结合了电学层析成像技术与人工智能算法的优势。电学层析成像技术,简…...

配置sudo免密却不生效的问题
如图,我配置了dhcp4这个账号sudo免密,但是执行sudo的时候还是要输密码。 查看dhcp的用户组,是配置了一个wheel组,而wheel组配置的是需要密码。 我们用dhcp4用户执行sudo -l 发下他匹配了两条命令策略,一个是免密一个…...

大模型赋能:金融智能革命中的特征工程新纪元
一、AI进化论:从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面:银行风控模型像老式收音机,需要人工反复调试参数才能捕捉风险信号;而大模型则是智能调音台,能自动“听…...
Significant Location Change
一、Significant Location Change是什么 “Significant Location Change(重大位置变化)” 是苹果 iOS 系统中一项用于在应用未主动运行时,监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…...
springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
我们在java项目开发中,如何设置服务器最大负载,过了服务器承受范围之后,提示用户稍后重试,避免 服务器无法提供正常服务 如何设置服务器负载比如:最大线程数,等待数量等,请看:springtomcat 用户…...

LHA9924芯片可代替AD7190,CS5530
LHA9924是一款高性能、单芯片模数转换器(ADC)。该器件包括一个低噪声可编程增益放大器(PGA)、Δ-Σ调制器和数字滤波器。该ADC支持两种运行模式,可在功耗与分辨率之间实现最佳平衡。双通道多路复用器可以选择外部信号测量和内部ADC测试信号。具有使输入电路短路来测…...

短视频矩阵系统技术saas源头6年开发构架
在短视频内容爆发式增长的今天,短视频矩阵系统SAAS技术成为企业快速搭建视频平台的关键解决方案。本文将系统解析从技术源头到服务落地的全流程开发路径。 一、系统定义与技术基础 短视频矩阵系统是集视频上传、智能编辑、多端分享、高清播放于一体的综合性平台。其…...
枫之谷Artale端午节大当机----后端技术的巨大风险
枫之谷Artale在端午节活动造成大量玩家上线塞爆,进不去,甚至在最后时段大当机,造成数万玩家怒火。 这体现了后端技术的影响,它不像是前端技术只对少数人造成影响,只要一出事,就是大批的玩家一起面对崩溃的伺…...

前端删除评论操作(局部更新数组)
评论的删除是局部删除,把所点击的评论id号传递给后端,通知后端在数据库中删除数据,并且返回数据,但是在前端并不直接接收返回的数据,而是触发回调事件,在前端上进行删除评论,首先通过pId观察他…...
数学复习笔记 28
前言 刷数学题非常爽啊。让我感觉自己能考一百四,一百五这种错觉。我和一个朋友说,我肯定能考一百四以上,他说他觉得我最多考一百二,笑死,我是这么菜的么。下面是线代第六章的例题的一些理解。我现在觉得考研数学不需…...
Delphi 实现远程连接 Access 数据库的指南
方法一:通过局域网共享 Access 文件(简单但有限) 步骤 1:共享 Access 数据库 将 .mdb 或 .accdb 文件放在局域网内某台电脑的共享文件夹中。 右键文件夹 → 属性 → 共享 → 启用共享并设置权限(需允许网络用户读写&a…...