当前位置: 首页 > article >正文

ES三种查询方式,为什么searchAfter效率高

在 Elasticsearch (ES) 中,常见的三种查询方式包括:

  1. 从头开始分页(from + size
  2. 基于游标的分页(search_after
  3. 滚动查询(Scroll)

1. 从头开始分页 (from + size)

这种方式是最常见的分页方法,from 表示跳过的结果集数量,size 表示每页返回的结果数量。它适用于小规模分页查询,但对于大规模数据集的分页查询会存在性能瓶颈。

问题:
  • 性能下降:随着分页深度的增加,查询效率会逐渐下降。因为 Elasticsearch 每次都需要从头开始扫描索引,然后跳过前面的文档。这意味着当你需要获取第 10000 页或更高页时,Elasticsearch 需要扫描和跳过大量的文档,这会导致查询速度变慢。
  • 高内存消耗:为了正确返回需要的数据,Elasticsearch 会加载大量的文档,造成内存消耗。

2. 基于游标的分页 (search_after)

这种方式是通过提供上次查询结果中的最后一条文档的某个字段(通常是排序字段)来继续查询。这意味着不再依赖 from 跳过数据,而是使用一个指向上一页最后一条文档的游标,从而直接进行下一页的查询。

优点:
  • 避免深度分页的效率问题search_after 的查询性能不会受到查询页数的影响。因为它不需要跳过前面的结果,只需要直接定位到上次查询的最后一条文档之后的结果。所以即使是大规模数据集,也可以快速查询后续的数据。
  • 更低的内存消耗:因为不需要加载和跳过大量文档,内存消耗更小。
为什么 search_after 效率高?
  • 游标查询:使用 search_after 时,Elasticsearch 根据排序字段(比如时间戳、ID等)定位到上一页的最后一条文档,然后从这一点开始进行查询。这样做避免了每次都重新扫描和跳过大量不需要的数据,从而提高了效率。
  • 适用于大规模分页:当你需要分页处理大量数据时,search_after 是非常合适的选择,因为它不会受 from 参数带来的性能下降影响。

3. 滚动查询(Scroll)

滚动查询通过维护一个“滚动上下文”(scroll context)来保证在长时间内能持续获取搜索结果。适用于需要遍历大量数据(比如导出或处理全部数据)的场景。

优点:
  • 高效遍历大数据集:在滚动查询的情况下,Elasticsearch 会保持一个查询上下文,这样可以高效地处理大量数据,避免重新计算相同的搜索结果。
  • 适合批量数据导出:当你需要导出大量数据而不关心实时更新时,滚动查询非常有用。
问题:
  • 长时间占用资源:由于滚动查询会保持查询上下文,它可能会占用 Elasticsearch 集群的资源,因此不适合用于长时间不更新或交互式的查询场景。

总结:

  • from + size:适用于小规模分页查询,但对大数据集分页查询效率差,性能会随着查询深度增加而下降。
  • search_after:非常适合大数据集的分页查询,通过游标优化了查询的效率,避免了深度分页的性能问题。
  • 滚动查询(Scroll):适用于批量数据导出或长期处理数据,能够保持查询上下文,但占用资源较多,通常不用于交互式查询。
为什么 search_after 效率高:

search_after 高效的原因是它避免了每次查询都跳过大量不必要的文档(如 from + size)。通过使用排序字段作为游标,search_after 直接定位到上一条文档的后续位置,大大提高了查询效率,尤其是在进行大数据集分页查询时,性能更加稳定。


http://www.kler.cn/a/554786.html

相关文章:

  • 全志A133 android10 适配SLM770A 4G模块
  • 网络安全入门攻击与防御实战(四)
  • 卷积神经网络实战宠物狗识别
  • 从硬件工程师视角解析宇树机器人:四足机器人的核心设计与技术挑战
  • leetcode876.链表的中间结点
  • HBuilderX中,VUE生成随机数字,vue调用随机数函数
  • Cannot import to svn: ‘C:\Program‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • QT基于Gstreamer采集的简单示例
  • Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
  • 【Python爬虫(22)】解锁MySQL性能密码:优化与索引全攻略
  • 【单臂路由配置】
  • leecode 刷题感悟-- 哈希表
  • Redis 的线程安全问题解析:为什么 Redis 是线程安全的?
  • 傅里叶变换和小波变换概述及实践
  • 如何在 Mac 上安装并配置 JDK 环境变量
  • Qt 中的QMainWindow、QWidget 和 QDialog 基类
  • Python爬虫实战:获取腾牛网高清壁纸图片
  • 深度神经网络 机器学习 超参数自动优化 ,PyGAD和DEAP是两个常用的遗传算法库,它们各自有不同的特点和适用场景
  • 我的书包作文范文
  • 鸿蒙-hvigor定制构建