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

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.xdnf.cn/news/693775.html

相关文章:

  • SpringBoot3.4.5 开启虚拟线程(JDK21)
  • WPF的基础设施:XAML基础语法
  • ISOLAR软件生成报错处理(三)
  • PR2020+MS1824+MS7210+MS2130 1080P@60Hz USB3.0采集
  • 用户关注表的设计
  • 【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
  • 钩子函数的作用(register_hook)
  • 基于c++11重构的muduo核心库项目梳理
  • 动态规划-LCR 091.粉刷房子-力扣(LeetCode)
  • xcode 编译运行错误 Sandbox: rsync(29343) deny(1) file-write-create
  • pycharm生成图片
  • 【设计模式】简单工厂模式,工厂模式,抽象工厂模式,单例,代理,go案例区分总结
  • 自动化测试基础知识详解(全)
  • 如何通过知识共享构建企业创新文化
  • 利用计算属性 结合 new date()写一个当前时间的计时器时间格式为年月日 时分秒
  • 通过API接口获取1688店铺所有商品的技术实现与实战指南
  • AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?(实战增补篇)
  • CANdela/Diva系列9--CDD文件在CANoe工程的应用1
  • Centos7升级openssl
  • 互联网大厂Java求职面试:AI与云原生架构实战解析
  • day39 pythonCNN网络
  • CSS Animation 详解
  • python第35天打卡
  • RISC-V 开发板 MUSE Pi Pro 搭建 Spacengine AI模型部署环境
  • 联软SDP+安渡:收敛暴露面 从生产网自动取数 安全高效
  • 班级管理系统
  • Python+Flask+Html做一个简单的测试联调工具
  • 链路追踪神器zipkin安装详细教程教程
  • C语言中:递归问题的深入研究
  • mp中的密码处理