elasticsearch 根据嵌套文档与父/子文档进行缩放,elasticsearch,elasticsearch" /> elasticsearch 根据嵌套文档与父/子文档进行缩放,elasticsearch,elasticsearch" />

elasticsearch 根据嵌套文档与父/子文档进行缩放

elasticsearch 根据嵌套文档与父/子文档进行缩放,elasticsearch,elasticsearch,我正在运行一个概念验证,以便我们对ES中更“规范化”的数据运行嵌套查询 e、 g.具有嵌套 客户-> -名称 -电子邮件 -活动-> -创造 -类型 现在,我遇到了一种情况,一个给定客户的事件列表可以移动到另一个客户。e、 g.客户A有50个活动 客户B有5000个事件 现在我想将所有事件从客户A移动到客户B 在拥有数百万客户的规模上,用户界面中的图形是否更适合父/子图形,或者嵌套是否应该能够处理它 在我的情况下有什么利弊 很难给出“嵌套足够好”这样的粗略性能指标,但我可以给你一些关于嵌套与父/

我正在运行一个概念验证,以便我们对ES中更“规范化”的数据运行嵌套查询

e、 g.具有嵌套

客户-> -名称
-电子邮件 -活动-> -创造 -类型

现在,我遇到了一种情况,一个给定客户的事件列表可以移动到另一个客户。e、 g.客户A有50个活动 客户B有5000个事件

现在我想将所有事件从客户A移动到客户B

在拥有数百万客户的规模上,用户界面中的图形是否更适合父/子图形,或者嵌套是否应该能够处理它


在我的情况下有什么利弊

很难给出“嵌套足够好”这样的粗略性能指标,但我可以给你一些关于嵌套与父/子的详细信息,这会有所帮助。我仍然建议进行一些基准测试,以验证性能是否可以接受

嵌套的

  • 嵌套文档彼此存储在相同的Lucene块中,这有助于提高读取/查询性能。读取嵌套文档的速度比等效的父/子文档快
  • 更新嵌套文档(父文档或嵌套子文档)中的单个字段会强制ES重新索引整个嵌套文档。对于大型嵌套文档,这可能非常昂贵
  • 更改“父级”表示ES将:删除旧单据,重新索引嵌套数据较少的旧单据,删除新单据,重新索引嵌套数据较少的新单据
父母/子女

  • 子项与父项分开存储,但路由到同一个碎片。因此,父/子对象在读取/查询方面的性能比嵌套的稍差
  • 父/子映射有一点额外的内存开销,因为ES在内存中维护一个“连接”列表
  • 更新子文档不会影响父文档或任何其他子文档,这可能会在大型文档上节省大量索引
  • 更改父级意味着您将删除旧的子文档,然后在新父级下索引相同的文档

嵌套可能工作得很好,但是如果您认为有可能进行大量的“数据洗牌”,那么父/子可能更合适。嵌套最适合于嵌套数据不经常更新但经常读取的实例。父级/子级更适合于数据移动更频繁的安排。

似乎表明,从0.20开始,可以进行部分更新:“更新API还支持传递部分文档(从0.20开始),该文档将合并到现有文档中(简单的递归合并、对象内部合并、替换核心“键/值”和数组)。”这仅适用于接口(例如,允许最终用户更新字段而不提供整个文档)。在内部,Lucene从_源(必须存储)发出删除和重新索引。Lucene只在初始文档创建期间写入连续块,从不进行随机访问写入,因此根本不可能进行更新。即使删除也不会被实际删除,只是标记为已删除,直到下一次合并将其清除。文档说明“可以更新父文档,而无需重新为子文档编制索引”。因此,可能“更改父文档”的部分意味着您将删除旧的子文档,然后在新的父文档下为相同的文档编制索引已经过时了。请参见Hi@Zach,在嵌套对象上分页的情况下,哪一种方法是最好的方法?