当前位置: 首页 > article >正文

Elasticsearch父子关系解析

引言

在复杂业务场景中,数据关联查询是搜索与分析的核心需求。以电商订单、文章评论、客户关系等场景为例,传统关系型数据库通过外键实现的多表关联,在分布式搜索场景下面临性能与扩展性挑战。Elasticsearch通过父子关系(Parent-Child Relationship)提供了一种高效的文档级联方案,支持灵活的多层数据建模与跨文档查询。

本文将以电商订单管理为实例,详解如何通过join字段实现父子文档关联,并结合has_parent/has_child查询完成跨文档检索。无论您是优化数据结构设计,还是解决高并发场景下的关联查询性能问题,均可通过本文掌握Elasticsearch父子关系的核心配置技巧与最佳实践。

父子关系

父子关系是一种在同一索引中将文档建立关联的方式。父子关系让你能够建立一种文档间的层次结构,其中子文档依赖于父文档,类似于关系数据库中的外键关系。在 Elasticsearch 中,父子关系的实现基于 nested type 和 join field(连接字段),并且需要启用 parent-child relationship 的功能。

父子关系概念

  • 父文档(Parent Document):是主文档,通常是需要进行查询和管理的核心数据。
  • 子文档(Child Document):是从文档,通常是依赖于父文档的额外数据或详细信息。

父子关系的应用场景

  • 一个订单(父文档)可以有多个订单商品(子文档)。
  • 一个客户(父文档)可以有多个订单(子文档)。
  • 一篇文章(父文档)可以有多个评论(子文档)。

举例说明

总共创建了3个文档,1 个父文档(订单),2 个子文档(订单商品)。这些文档在同一个索引(ecommerce)中,但它们通过 父子关系 互相关联。父文档为 order 类型,子文档为 order_item 类型,子文档通过 parent 字段指向父文档的 ID,从而建立了父子关系。

创建索引与映射

为 ecommerce 索引创建了一个 join 字段 relationship,并指定了父子关系:order 是父文档,order_item 是子文档。

PUT /ecommerce
{"mappings": {"properties": {"relationship": {"type": "join","relations": {"order": "order_item"  // order 是父文档,order_item 是子文档}},"order_id": {"type": "keyword"},"product_name": {"type": "text"},"quantity": {"type": "integer"},"price": {"type": "double"}}}
}

插入父文档(订单)

插入一个父文档(订单),它没有任何子文档。

POST /ecommerce/_doc/1
{"order_id": "ORD12345","relationship": {"name": "order"}
}

插入子文档(订单商品)

插入几个子文档(订单商品)。子文档需要指定 relationship 字段,指出它依赖的父文档。子文档 order_item 的 parent 字段指定了它所依赖的父文档(订单)的 ID。

POST /ecommerce/_doc/2
{"product_name": "Laptop","quantity": 1,"price": 1200.00,"relationship": {"name": "order_item","parent": "1"  // 指定父文档的ID}
}POST /ecommerce/_doc/3
{"product_name": "Mouse","quantity": 2,"price": 25.50,"relationship": {"name": "order_item","parent": "1"   // 指定父文档的ID}
}

查询子文档

使用 has_parent 查询来获取特定父文档下的所有子文档。例如,我们想查找订单 ORD12345 下的所有商品。

GET /ecommerce/_search
{"query": {"has_parent": {"parent_type": "order",  // 父文档类型"query": {"match": {"order_id": "ORD12345"  // 查询父文档 ID}}}}
}

查询父文档

使用 has_child 查询来获取某个子文档下的父文档。例如,我们想查找包含 Laptop 这一商品的订单。

GET /ecommerce/_search
{"query": {"has_child": {"type": "order_item",  // 子文档类型"query": {"match": {"product_name": "Laptop"  // 查询子文档的字段}}}}
}

感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!

http://www.lryc.cn/news/2395104.html

相关文章:

  • 33、请求处理【源码分析】Servlet API参数解析原理
  • 基于深度学习的三维图像生成项目开发方案
  • 面试题——计算机网络:HTTP和HTTPS的区别?
  • Flutter 包依赖升级指南:让项目保持最新状态
  • LeeCode 98. 验证二叉搜索树
  • JVM类加载高阶实战:从双亲委派到弹性架构的设计进化
  • [网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发
  • maven编译时跳过test过程
  • threejsPBR材质与纹理贴图
  • 深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级
  • 【计算机网络】子网划分
  • Git入门到精通:30分钟掌握核心技巧
  • Redis7底层数据结构解析
  • Android 异步编程中协程的完整实战示例
  • 多部手机连接同一wifi的ip一样吗?
  • 大语言模型值ollama使用(1)
  • 大模型应用开发之Langchain
  • thc-ssl-dos:SSL 压力测试的轻量级工具!全参数详细教程!Kali Linux教程!
  • 什么是内网ip证书
  • 【速通RAG实战:进阶】17、AI视频打点全攻略:从技术实现到媒体工作流提效的实战指南
  • 立控信息智能装备柜:科技赋能军队装备管理现代化
  • 【freertos-kernel】queue(发送)
  • 【华为云物联网】如何实现在 MQTT.fx 上模拟数据间隔上传一次,并按设定系数变动数据
  • 破解高原运维难题:分布式光伏智能监控系统的应用研究
  • 图标变白,开始菜单栏无法打开程序(以jupyter为例)
  • 大语言模型(LLM)入门 - (1) 相关概念
  • 行为型:访问者模式
  • C++数据结构 : 哈希表的实现
  • 抖音电商客户端一面面经
  • JavaScript 在 AcroForm 中的广泛应用