文档
Parent / Child
-
对象和Nested对象的局限性
- 每次更新,需要重新索引整个对象(包括根对象和嵌套对象)
-
ES提供了类似关系型数据库中Join的实现,使用Join数据类型实现,可以通过维护Parent / Child的关系,从而分离两个对象
- 父文档和子文档是两个独立的文档
- 更新父文档无需重新索引子文档。子文档被添加,更新或者删除也不会影响到父文档和其他的子文档
父子关系
定义父子关系分为以下几个步骤
-
设置索引的Mapping
-
-
插入父文档数据
-
-
插入子文档数据
-
父子查询相关
-
has_child 查询
-
-
has_parent 查询
-
-
其它查询
-
-
复杂bool查询
-
指定routing,确保路由到同一分片
- 父文档和子文档必须存在相同的分片上
- 确保查询join的性能
- 当指定子文档时候,必须指定它的父文档id
嵌套对象 V.S 父子文档
嵌套对象 | 父子文档 | |
---|---|---|
优点 | 文档存储在一起,读取性能高 | 父子文档可以独立更新 |
缺点 | 更新嵌套的子文档时,需要更新整个文档 | 需要额外的内存维护关系,读取性能相对差 |
场景 | 子文档偶尔更新,已查询为主 | 子文档更新频繁 |