版权声明:本文为博主原创文章,未经博主允许不得转载。转载请务必加上原作者:铭毅天下,原文地址:blog.csdn.net/laoyang360 https://blog.csdn.net/wojiushiwo987/article/details/88784748
Elasticsearch多表关联问题是讨论最多的问题之一,如:博客和评论的关系,用户和爱好的关系。
多表关联通常指:1对多,或者多对多。
本文以星球问题
会出发点,引申出ES多表关联认知,分析了4种
关联关系的适用场景、优点、缺点,
希望对你有所启发,为你的多表关联方案选型、实战提供帮助。
关系型数据库中的多表之间的关联查询,ES中有什么好的解决方案?
如果我把关联关系的表迁移到ES中放到一个type下,文档结构除了对象之间的嵌套还有什么好的解决方案?
关系数据库是专门为关系设计的,有如下特点
:
关系型数据库的缺陷
:
Elasticsearch ,和大多数 NoSQL 数据库类似,是扁平化的。索引是独立文档的集合体。 文档是否匹配搜索请求取决于它是否包含所有的所需信息和关联程度。
Elasticsearch 中单个文档的数据变更是满足ACID
的, 而涉及多个文档时则不支持事务。当一个事务部分失败时,无法回滚索引数据到前一个状态。
扁平化有以下优势
:
关系
管理,而ES擅长的是检索。关联关系仍然非常重要。某些时候,我们需要缩小扁平化和现实世界关系模型的差异。
以下四种
常用的方法,用来在 Elasticsearch 中进行关联数据的管理:
这是普遍使用的技术,即在应用接口层面来处理关联关系。
针对星球问题实践,
- 存储层面:独立两个索引存储。
- 实际业务层面分两次请求:
第一次查询返回:Top5中文姓名和成绩;
根据第一次查询的结果,第二次查询返回:Top5中文姓名和英文姓名;将第一次查询结果和第二次查询结果组合后,返回给用户。
即:实际业务层面是进行了两次查询,统一返回给用户。用户是无感知
的。
适用场景:数据量少
的业务场景。
优点:数据量少时,用户体验好。
缺点:数据量大,两次查询耗时肯定会比较长,影响用户体验。
引申场景:关系型数据库和ES 结合,各取所长。将关系型数据库全量同步到 ES 存储,不做冗余存储。
如前所述:ES 擅长的是检索,而 MySQL 才擅长关系管理。所以可以考虑二者结合,使用 ES 多索引建立相同的别名,针对别名检索到对应 ID 后再回 MySQL 查询,业务层面通过关联 ID join 出需要的数据。
对应于官方文档中的“Data denormalization”,官方直接翻译为:“非规范化你的数据”,总感觉规范化是什么鬼,不好理解。
通俗解释就是:冗余存储
,对每个文档保持一定数量的冗余数据可以在需要访问时避免进行关联。
这点通过logstash 同步关联数据到ES时,通常会建议:先通过视图对Mysql数据做好多表关联,然后同步视图数据到ES。此处的视图就是宽表。
针对星球问题实践:姓名、英文名、成绩两张表合为一张表存储。
适用场景:一对多或者多对多关联。
优点:速度快。因为每个文档都包含了所需的所有信息,当这些信息需要在查询进行匹配时,并不需要进行昂贵的关联操作。
缺点:索引更新或删除数据,应用程序不得不处理宽表的冗余数据;
由于冗余存储,导致某些搜索和聚合操作可能无法按照预期工作。
Nested类型是ES Mapping定义的集合类型
之一,它是比object类型更NB的支持独立检索的类型。
举例:有一个文档描述了一个帖子和一个包含帖子上所有评论的内部对象评论。可以借助 Nested 实现。
实践注意1:当使用嵌套文档时,使用通用的查询方式是无法访问到的,必须使用合适的查询方式(nested query、nested filter、nested facet等),很多场景下,使用嵌套文档的复杂度在于索引阶段对关联关系的组织拼装。
推荐实践:https://blog.csdn.net/laoyang360/article/details/82950393
实践注意2:
index.mapping.nested_fields.limit 缺省值是50。即:一个索引中最大允许拥有50个nested类型的数据。
index.mapping.nested_objects.limit 缺省值是10000。即:1个文档中所有nested类型json对象数据的总量是10000。
适用场景:1 对少量,子文档偶尔更新、查询频繁的场景。
如果需要索引对象数组并保持数组中每个对象的独立性,则应使用嵌套 Nested 数据类型而不是对象 Oject 数据类型。
优点:nested文档可以将父子关系的两部分数据(举例:博客+评论)关联起来,可以基于nested类型做任何的查询。
缺点:查询相对较慢,更新子文档需要更新整篇文档。
注意:6.X之前的版本的父子文档存储在相同索引的不同type中。而6.X之上的版本,单索引下已不存在多type的概念
。父子文档Join的都是基于相同索引相同type实现的。
Join类型是ES Mapping定义的类型之一,用于在同一索引的文档中创建父/子关系。 关系部分定义文档中的一组可能关系,每个关系是父名称和子名称。
实践参考:https://blog.csdn.net/laoyang360/article/details/79774481
适用场景:子文档数据量要明显多于
父文档的数据量,存在1 对多量的关系;子文档更新频繁的场景。
举例:1 个产品和供应商之间是1对N的关联关系。
当使用父子文档时,使用has_child 或者has_parent做父子关联查询。
优点:父子文档可独立更新。
缺点:维护Join关系需要占据部分内存,查询较Nested更耗资源。
思维定式
。扁平
的文档模型。建模
处多下功夫,以提升检索效率。性能问题
。 nested 类型检索使得检索效率慢几倍,父子Join 类型检索会使得检索效率慢几百倍。以上内容,实际官方文档都有明确的描述。我把内容加上自己的理解,作了精炼和解读。
再次强调:第一手资料的重要性
。但本着“再显而易见的道理,也有N多人不知道”
的原则,一定要读英文官方文档,加深认知理解。
Elasticsearch多表关联你是如何做的呢?欢迎留言写下您的思考。
参考:
[1] https://www.elastic.co/guide/en/elasticsearch/guide/current/relations.html
[2] rockybean 教程
铭毅天下——Elasticsearch基础、进阶、实战第一公众号
Original url: Access
Created at: 2019-04-15 10:54:40
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论