0

目前在我的 ES 文档结构中,有一个“对象”类型的字段。这是一个 json 对象,里面最多可以有 3000 个字段。问题是有时我的 ES 会因为文档太大而耗尽内存。所以我希望改变我的文档结构。

我正在查看的两个结构是 - 嵌套映射和父子关系。两种结构都满足我的搜索要求。正在考虑的要点:

  1. 我读到嵌套查询比子查询快得多。
  2. 嵌套映射也将嵌套字段保存为单独的文档。

我面临的两点困惑:

  1. 嵌套索引如何工作?ES 是一次性获取整个文档并立即对其进行完整分析,还是对嵌套文档的请求是单独的。因为在第一种情况下,ES 可能会再次耗尽内存。

  2. 当我们说父子查询较慢时,我们的意思是多慢?

寻找输入。

4

3 回答 3

1

嵌套比父/子更快,并且更易于管理。事实上,您可以索引没有父母的孩子,因此您在索引时必须小心。此外,当您想删除一个父条目时,您必须删除所有子节点,这不是一项自动任务。另一方面,如果您想更改/更新您的条目,父母/孩子会更舒服。使用嵌套类型,您不能只更改嵌套字段中的一个嵌套值,您必须重新索引嵌套字段中的所有嵌套值。使用父/子,您也只能更改/更新该父或子字段中的一个值。嵌套被认为是索引中的原子关系数据,而父/子只是一种不同的数据类型,它保持来自 2 个字段的关系 - 父、子。你可以在这里阅读泡菜的帖子,https://discuss.elastic.co/t/choosing-parent-child-vs-nested-document/6742

于 2017-09-20T09:25:32.760 回答
0

主要区别在于嵌套比父/子更快,但是,嵌套文档需要重新索引父级及其所有子级,而父子级允许重新索引/添加/删除特定子级。

例如,一个产品可以只有几个标签,但可以有很多评论,所以保持标签嵌套可能不是问题。但是对博客文章的(数百条)评论是一个问题。

于 2022-01-20T13:20:14.167 回答
0

嵌套::

  1. 嵌套文档彼此存储在同一个 Lucene 块中,这有助于提高读取/查询性能。阅读嵌套文档比等效的父/子更快。

  2. 更新嵌套文档(父级或嵌套子级)中的单个字段会强制 ES 重新索引整个嵌套文档。这对于大型嵌套文档来说可能非常昂贵。

  3. “交叉引用”嵌套文档是不可能的。

  4. 最适合不经常更改的数据。

家长/孩子::

  1. 子项与父项分开存储,但被路由到同一个分片。因此,父/子在读取/查询上的性能略低于嵌套。

  2. 父/子映射有一点额外的内存开销,因为 ES 在内存中维护了一个“连接”列表。

  3. 更新子文档不会影响父文档或任何其他子文档,这可能会节省大量对大型文档的索引。

  4. 对 Parent/Child 进行排序/评分可能很困难,因为 Has Child/Has Parent 操作有时可能是不透明的

于 2021-05-07T04:40:10.973 回答