首页 > 解决方案 > Elasticsearch:在同一个分片上折叠文档是否会在折叠时提高性能?

问题描述

Elasticsearch Parent/Child 嵌套关系通过在摄取期间使用 _routing 字段将父级和子级强加在同一个分片上。

我想知道使用相同的过程是否会在使用collapseelasticsearch 的特性时提供性能改进,还是会使其变得更糟?

如果我们看这两种情况:

1) 路由到同一个分片:分片能够自行折叠并返回已经完全折叠的文档

2)文档在许多分片上:崩溃只能在以后发生,所有分片都会返回大量稍后将被折叠的文档。

我不知道 elasticsearch 是否会做第二个,即使文档在同一个分片上。

谢谢。

标签: performanceelasticsearch

解决方案


场塌陷的完整起源(在 ES 5.3 中引入)可以在PR 22337 (issue 21833)中找到。

最初的想法是创建一个新的top_groups聚合,以terms+top_hits组合为模型,但最终它被认为实施起来成本高昂,而且不一定是最优的。

字段折叠最终在搜索层中实现,因为它可以从现有的查询/获取阶段中受益,并且比作为聚合执行它需要更少的内存。分页也可以开箱即用。

讨论了使用分组字段作为路由键是否是一个好主意,以确保所有热门命中都位于同一个分片上,但最终这被认为是一个太大的限制。

因此,长话短说,在字段折叠的情况下,将所有文档定位在同一个分片上没有这样的限制,因为无论如何都会将获取请求(阶段 2)发送到所有分片。

与往常一样,最好的方法是亲自尝试并衡量性能。

  • 1 个索引和 1 个分片(有和没有路由键)
  • 1 个带有多个分片的索引(有和没有路由键)

我的看法是它不会有太大的区别,因为只有热门搜索被折叠,并且正常的搜索查询(没有字段折叠)无论如何也会经历两个查询/获取阶段。


推荐阅读