ElasticSearch文档的父子关系

文档

官方文档

权威指南

PHP文档

php ElasticSearch父子文档操作

Parent / Child

  • 对象和Nested对象的局限性

    • 每次更新,需要重新索引整个对象(包括根对象和嵌套对象)
  • ES提供了类似关系型数据库中Join的实现,使用Join数据类型实现,可以通过维护Parent / Child的关系,从而分离两个对象

    • 父文档和子文档是两个独立的文档
    • 更新父文档无需重新索引子文档。子文档被添加,更新或者删除也不会影响到父文档和其他的子文档

父子关系

定义父子关系分为以下几个步骤

  1. 设置索引的Mapping

  2. 插入父文档数据

  3. 插入子文档数据

父子查询相关

  1. has_child 查询

  2. has_parent 查询

  3. 其它查询

  4. 复杂bool查询

指定routing,确保路由到同一分片

  • 父文档和子文档必须存在相同的分片上
    • 确保查询join的性能
  • 当指定子文档时候,必须指定它的父文档id

嵌套对象 V.S 父子文档

嵌套对象 父子文档
优点 文档存储在一起,读取性能高 父子文档可以独立更新
缺点 更新嵌套的子文档时,需要更新整个文档 需要额外的内存维护关系,读取性能相对差
场景 子文档偶尔更新,已查询为主 子文档更新频繁