Elastic Search - 加入最佳实践

Elastic Search - Joins best practises

作为文档的一部分,我遇到了以下内容

 In Elasticsearch the key to good performance is to de-normalize your data into documents

还有,

the restriction about, where both the child and parent documents must be on the same shard

给定多级层次结构的场景(grandparent --> parent ---> child),其中一些 parent 具有更多 childern 与其他分片相比,数据可能会倾斜,并且很少有分片包含比其他分片大得多的数据。

  1. 获得更高性能的最佳实践是什么?

  2. 将所有层次结构放在一个文档中(而不是每个级别一个文档)是个好主意吗?如果有更多 childern,parent 数据可能会冗余,因为 parent 数据需要复制到所有文档?

是的,你提到的两个陈述都是正确的,让我在你的 use-case.

的上下文中回答你的两个问题
  1. 将所有层次结构放在一个文档中(而不是每个级别一个文档)是个好主意吗?如果 children 多了,parent 数据可能会冗余,因为 parent 数据需要复制到所有文档?

回答:一般来说,如果您在单个文档中搜索所有数据,搜索肯定会快得多,这就是对数据库中的数据进行非规范化的全部原因,这在第一条语句中也提到了,因为您不必创建多个工作线程并合并多个 documents/shards/nodes. 的结果,而且存储也很便宜,虽然它会节省存储成本但节省计算成本(成本更高比存储)。 简而言之,如果您比 de-normalizing 更担心查询性能,您的数据将大大提升它。

  1. 获得更高性能的最佳做法是什么?

回答:如果您仍然继续使用规范化方法,那么如前所述,您应该将所有相关文档保存在同一个分片中,并且应该实施 custom routing 来实现这一点。