【Elasticsearch】映射:Nested 类型

news2025/7/23 12:32:06

映射: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_noif_primary_term 避免并发冲突。

业务含义总结

  • 文档更新成功
    • 版本号 _version1 变为 2,说明这是对文档的第二次修改。
    • result: "updated" 确认了更新操作已生效(如果是首次创建,会返回 "created")。
  • 集群状态健康
    • 所有分片(total: 2)均成功更新(successful: 2),无失败(failed: 0)。
  • 后续操作依据
    • _seq_no_primary_term 可用于后续的并发更新控制。

常见问题

  • 如果 resultnoop:表示脚本执行后未实际修改文档(例如条件不满足或值未变化)。
  • 如果 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 50nested 字段(index.mapping.nested_fields.limit
    • 一个文档中所有 nested 对象数默认不超过 10000 10000 10000 个(index.mapping.nested_objects.limit
  • 与父子文档对比
    • Nested 适合小规模、紧密关联的数据
    • 父子文档(join 类型)适合大规模、松散关联的数据
  • 更新开销
    • 更新父文档会替换整个 nested 数组
    • 频繁更新 nested 字段会影响性能
  • 查询特殊性
    • 必须使用 nested 查询来查询 nested 字段
    • 普通查询无法正确匹配 nested 对象间的关系

通过合理使用 nested 类型,可以准确建模和查询复杂的一对多关系数据,但要注意其对性能的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402537.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 + UniApp 蓝牙连接与数据发送(稳定版)

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

三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较

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

Nature子刊同款的宏基因组免疫球蛋白测序怎么做?

免疫球蛋白A&#xff08;IgA&#xff09;是人体肠道黏膜分泌的主要抗体&#xff0c;它在塑造肠道微生物群落和维持肠道稳态中起着关键作用&#xff0c;有研究发现缺乏IgA的患者更容易患自身免疫性疾病和感染性疾病。 目前用于研究IgA结合的主要技术是IgA-SEQ&#xff0c;结合了…

2025年牛客网秋招/社招高质量 Java 面试八股文整理

Java 面试 不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的。关键在于理解企业的需求&#xff0c;明确自己的定位&#xff0c;以及掌握一定的应试技巧。 笔试部分&#xff0c;通常是对基础知识、…

ADI的BF609双核DSP怎么做开发,我来说一说(五)LAN口测试

作者的话 ADI的双核DSP&#xff0c;第二颗是Blackfin系列的BF609&#xff0c;这颗DSP我用了很久&#xff0c;比较熟悉&#xff0c;且写过一些给新手的教程。 硬件准备 ADSP-BF609-CORE&#xff1a;ADI BF609开发板 产品链接&#xff1a;https://item.taobao.com/item.htm?…

行业赋能篇-2-能源行业安全运维升级

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

飞云智能波段主图+多空短线决策副图指标,组合操盘技术图文解说

如上图&#xff0c;组合指标&#xff1a;主图-飞云智能波段&#xff0c;红线上红色K线标记&#xff0c;波段做多.副图指标-多空短线决策&#xff0c;跟踪做短线&#xff0c;红柱做多&#xff0c;绿柱短线卖出或做空。 实战操作中&#xff0c;我们在主图红色线支撑上红色K线出现…

【51单片机】1. 基础点灯大师

1. 新建一个项目集一些基本操作 打开Keli软件&#xff0c;然后&#xff1a; 【Project】→【new μVision Project】→选择项目保存位置 建议文件名选一些通用的名字&#xff0c;如【Project】 左下角选择【Atmel】的【AT89C52】 弹出的【是否添加启动文件到文件夹下】&…

PC端直接打印功能(包括两张图片合并功能)

一、 效果图 二、demo代码 <template><div class"box"><divref"printContent"class"print-content"><div class"print-title">打印图片</div><imgclass"preview-image":src"merged…

Vue前端篇——项目目录结构介绍

&#x1f4d8; 前言 在正式开始学习 Vue 3 开发之前&#xff0c;了解并熟悉其项目目录结构是非常关键的第一步。一个清晰、规范的目录结构不仅有助于开发者高效地组织代码&#xff0c;还能显著提升项目的可读性和可维护性。 Vue 3 作为现代前端开发中广泛使用的主流框架之一&…

抽象工厂模式深度解析:从原理到与应用实战

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

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

Linux常用命令学习手册

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

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解

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

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

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

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统

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

配置sudo免密却不生效的问题

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

大模型赋能:金融智能革命中的特征工程新纪元

一、AI进化论&#xff1a;从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面&#xff1a;银行风控模型像老式收音机&#xff0c;需要人工反复调试参数才能捕捉风险信号&#xff1b;而大模型则是智能调音台&#xff0c;能自动“听…

LHA9924芯片可代替AD7190,CS5530

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

短视频矩阵系统技术saas源头6年开发构架

在短视频内容爆发式增长的今天&#xff0c;短视频矩阵系统SAAS技术成为企业快速搭建视频平台的关键解决方案。本文将系统解析从技术源头到服务落地的全流程开发路径。 一、系统定义与技术基础 短视频矩阵系统是集视频上传、智能编辑、多端分享、高清播放于一体的综合性平台。其…