Elasticsearch 如何处理关系型数据

2026-04-12 14:43:08

1、数据冗余的扁平化设计

数据冗余的扁平化设计思想基础是以空间换取时间。ES是为搜索而生的,所以我们对ES索引结构的设计要尽可能的考虑到方便搜索以及提高搜索的性能。数据冗余是常见的一种方式,例如一个公园是属于山西省的,则山西省的人都可以免费游公园,如果一个公园是属于山西省太原市的则山西省太原市的人可以免费游公园,如果一个公园是属于山西省太原市小店区的则山西省太原市小店区的人可以免费游公园,查询某一个县或者区的人可以免费游玩的公园有那些,则可以创建如下ES索引;countyIds字段用来存储所有该公园可以免费的所有县ID

Elasticsearch 如何处理关系型数据

2、嵌套类型(Nested)索引设计

嵌套类型(Nested)索引设计可以比较容易的表达数据之间的关系,但是也会导致Nested对象的查询性能慢几倍,同时覆盖更新外层对象的时候也需要覆盖Nested对象。例如一个学生可以有多个老师,在搜索学生信息的同时想搜索出老师的信息,可以创建如下索引

Elasticsearch 如何处理关系型数据

3、父子文档(join)索引设计

Elasticsearch 提供了类似关系型数据库中 Join 的实现, 即Join 数据类型. Join数据类型定义了文档之间的父子关系, 从而分离两个对象.

1.父文档和子文档是两个独立的文档.

2.更新父文档无需重新索引子文档.

3.子文档被添加, 更新或者删除也不会影响到父文档和其他的子文档

父子文档(join)索引设计需要额外的内存维护父子文档之间关系, 读取性能相对差,比嵌套类型(Nested)还差好几倍

一个学生可以有多个老师,在搜索学生信息的同时想搜索出老师的信息,可以创建如下索引


Elasticsearch 如何处理关系型数据

4、多个独立的索引之间依靠主外键关联

可以不使用Nested和Join类型来处理具有关联关系的数据,依照数据表的接口建立一对一的索引,通过多次搜索来实现关联数据的查询,缺点就是需要多次网络连接调用,影响接口总体性能,如果其中异常查询超时或者失败,整个接口的查询失败

5、总结与注意点

1.ES6.0之后一个索引中已经不能创建2个type类型的文档,ES7.0之后type将会被废除

2.根据不同的应用场景选中合适的索引结构

3.建议不要创建过于复杂的索引接口,复杂的索引接口会导致代码的复杂度增加,索引结构扩展困难,增加新同学的学习成本

猜你喜欢