父子v / s多个索引-Elasticsearch 6.2+

Nit*_*ndy 5 elasticsearch

当前,我们有一个使用父子映射的ES 5.3集群,因为我们的数据遵循此模型。父子映射是最好的选择,因为它支持集群侧连接,并通过存储在同一分片中提供性能优势。

从5.3到6.2的迁移涉及重大更改,因为ES v6.0及更高版本不再支持多种映射类型。

想知道是否值得在使用连接数据类型的新版Elasticsearch中坚持使用父子数据模型。

据我所知,有三种可能的选择

  1. 使用新的联接数据类型保留父子映射。

    优点

    • 集群侧联接
    • 性能优势
    • 仍然可以使用has_parent,has_child查询

    缺点

    • 平面映射架构(如果文档具有很多属性,将变得很难看)
    • 仅通过查看文档就难以识别类型
  2. 为每种映射类型创建单独的索引

    优点

    • 映射看起来更清晰
    • 只需查看即可轻松识别文档类型
    • 可以利用路由将父项的所有相关子文档放在同一分片中
    • 每个索引可以具有不同的分片配置(灵活性)

    缺点

    • 在两个索引中都需要一个公共字段来维护关系
    • 无法再使用has_parent,has_child查询
    • 需要应用程序侧连接
    • 子索引与父索引相比可以变得很大
    • 执行联接的多个查询会增加整体延迟
  3. 单个索引,但具有用于定义文档类型的自定义字段

    优点

    • 无需使用联接类型
    • 可以利用自定义路由将相关文档放在同一分片中

    缺点

    • 映射看起来很复杂
    • 索引会变得非常大,因为所有文档都将驻留在同一索引中

我更倾向于具有多个索引的第二种选择。我可以看到的主要缺点是应用程序侧连接可能很昂贵。同时,elasticsearch文档说has_parent,has_child查询也很昂贵。

通过使各个索引使用路由并因此在各个索引中实现数据局部性,可以在某种程度上实现将父子文档存储在同一分片中的另一个优点。

当前集群统计

270492501总文档

1596009父文档

268896492子文档

父级/子级文档计数比例最大为1:400

36个分片(12个主副本,24个副本)

92.33 GB数据

父级文档阅读量很大。子文档读写繁重。

想知道是否还有其他我需要考虑的性能/扩展方面。谢谢