performance - Elasticsearch:在同一个分片上折叠文档是否会在折叠时提高性能?
问题描述
Elasticsearch Parent/Child 嵌套关系通过在摄取期间使用 _routing 字段将父级和子级强加在同一个分片上。
我想知道使用相同的过程是否会在使用collapse
elasticsearch 的特性时提供性能改进,还是会使其变得更糟?
如果我们看这两种情况:
1) 路由到同一个分片:分片能够自行折叠并返回已经完全折叠的文档
2)文档在许多分片上:崩溃只能在以后发生,所有分片都会返回大量稍后将被折叠的文档。
我不知道 elasticsearch 是否会做第二个,即使文档在同一个分片上。
谢谢。
解决方案
场塌陷的完整起源(在 ES 5.3 中引入)可以在PR 22337 (issue 21833)中找到。
最初的想法是创建一个新的top_groups
聚合,以terms
+top_hits
组合为模型,但最终它被认为实施起来成本高昂,而且不一定是最优的。
字段折叠最终在搜索层中实现,因为它可以从现有的查询/获取阶段中受益,并且比作为聚合执行它需要更少的内存。分页也可以开箱即用。
讨论了使用分组字段作为路由键是否是一个好主意,以确保所有热门命中都位于同一个分片上,但最终这被认为是一个太大的限制。
因此,长话短说,在字段折叠的情况下,将所有文档定位在同一个分片上没有这样的限制,因为无论如何都会将获取请求(阶段 2)发送到所有分片。
与往常一样,最好的方法是亲自尝试并衡量性能。
- 1 个索引和 1 个分片(有和没有路由键)
- 1 个带有多个分片的索引(有和没有路由键)
我的看法是它不会有太大的区别,因为只有热门搜索被折叠,并且正常的搜索查询(没有字段折叠)无论如何也会经历两个查询/获取阶段。
推荐阅读
- javascript - 从网页获取所有图像并以编程方式保存到磁盘(NodeJS 和 Javascript)
- android - 空间不足时更改垂直偏差
- html - 在 Bootstrap 4 的移动设备上,中心柱不会显得太薄
- c - 两个不同函数指针的typedef是否有效?
- java - Hibernate Criteria:不同的实体,Fetch join 和 MaxResults
- angular - Angular 单元测试表单验证 - 控制保持不变
- python - 如何找到 10000 以下的最长的合数序列?我如何只打印最长的系列?
- django - 将动态生成的列添加到 django 管理列表视图
- java - 正则表达式匹配包含单词的确切字符串
- python-3.x - 如何通过代码创建odoo 12网站子菜单?