news 2026/4/10 0:51:44

Elasticsearch的深度翻页问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch的深度翻页问题

使用ES做搜索引擎拉取数据的时候,如果数据量太大,通过传统的from + size的方式并不能获取所有的数据(默认最大记录数10000),因为随着页数的增加,会消耗大量的内存,导致ES集群不稳定。

ES提供了3中解决深度翻页的操作,分别是scroll、sliced scroll 和 search after:
scroll

scroll api提供了一个全局深度翻页的操作, 首次请求会返回一个scroll_id,使用该scroll_id可以顺序获取下一批次的数据;scroll 请求不能用来做用户端的实时请求,只能用来做线下大量数据的翻页处理,例如数据的导出、迁移和_reindex操作,还有同一个scroll_id无法并行处理数据,所以处理完全部的数据执行时间会稍长一些。

例如我们使用scroll翻页获取包含elasticsearch的Twitter,那么首次请求的语句如下:

POST /twitter/_search?scroll=1m
{
"size": 100,
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}

其中scroll=1m是指scroll_id保留上下文的时间

首次请求会返回一个scroll_id,我们根据这个值去不断拉取下一页直至没有结果返回:

POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}

针对scroll api下,同一个scroll_id无法并行处理数据的问题,es又推出了sliced scroll,与scroll api的区别是sliced scroll可以通过切片的方式指定多scroll并行处理。
sliced scroll

sliced scroll api 除指定上下文保留时间外,还需要指定最大切片和当前切片,最大切片数据一般和shard数一致或者小于shard数,每个切片的scroll操作和scroll api的操作是一致的:

GET /twitter/_search?scroll=1m
{
"slice": {
"id": 0,
"max": 2
},
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
GET /twitter/_search?scroll=1m
{
"slice": {
"id": 1,
"max": 2
},
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}

因为支持并行处理,执行时间要比scroll快很多。
search after

上面两种翻页的方式都无法支撑用户在线高并发操作,search_after提供了一种动态指针的方案,即基于上一页排序值检索下一页实现动态分页:

首次查询

GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"date": "asc"},
{"tie_breaker_id": "asc"}
]
}

因为是动态指针,所以不需要像scroll api那样指定上下文保留时间了

通过上一页返回的date + tie_breaker_id最后一个值做为这一页的search_after:

GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"_score": "desc"},
{"tie_breaker_id": "asc"}
]
}

说白了 search_after 并没有解决随机跳页查询的场景,但是可以支撑多query并发请求;search_after 操作需要指定一个支持排序且值唯一的字段用来做下一页拉取的指针,这种翻页方式也可以通过bool查询的range filter实现。

https://blog.csdn.net/qq827245563/article/details/149349883

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 10:35:13

PyTorch-CUDA-v2.7镜像如何启用梯度检查点功能

PyTorch-CUDA-v2.7镜像中梯度检查点的高效启用实践 在训练大规模Transformer模型时,你是否曾因“CUDA out of memory”错误而被迫减小batch size?又或者在新服务器上花费数小时配置PyTorch和CUDA版本兼容问题?这些问题在当前大模型研发中极为…

作者头像 李华
网站建设 2026/4/8 0:24:33

PyTorch-CUDA-v2.7镜像中配置301重定向维持SEO权重

PyTorch-CUDA-v2.7镜像中配置301重定向维持SEO权重 在AI开发平台日益普及的今天,许多研究机构和企业通过公开Jupyter服务或文档门户为开发者提供深度学习环境。这些页面一旦被搜索引擎收录,便成为技术品牌的重要流量入口。然而,随着系统升级、…

作者头像 李华
网站建设 2026/4/9 21:46:56

PyTorch-CUDA-v2.7镜像预装了哪些常用库?pip list一览

PyTorch-CUDA-v2.7 镜像预装了哪些常用库?pip list 一览 在深度学习项目中,最让人头疼的往往不是模型设计,而是环境配置。你是否经历过这样的场景:论文复现时提示 DLL not found,明明本地能跑的代码换一台机器就报错&a…

作者头像 李华
网站建设 2026/4/8 9:45:07

AI率太高不知道怎么降?十大降AI工具真实测评

被 AI率折磨过的人,才知道有多崩。 如果这篇整理能帮你少走点弯路,那就值了。 1、嘎嘎降AI 官网:https://www.aigcleaner.com/?sourcecsdn&keyword1229 功能特点: 1、检测、降重和降AI一键同步,相当于一次就能…

作者头像 李华
网站建设 2026/4/9 10:16:04

PyTorch-CUDA-v2.7镜像中实现Function Calling功能的结构设计

PyTorch-CUDA-v2.7镜像中实现Function Calling功能的结构设计 在当前AI系统日益复杂的应用场景下,一个模型是否“智能”,早已不再仅由其推理准确率决定。真正的挑战在于:如何让模型具备与现实世界交互的能力?比如,当用…

作者头像 李华
网站建设 2026/4/9 21:01:34

PyTorch-CUDA-v2.7镜像让实验到部署无缝衔接

PyTorch-CUDA-v2.7镜像让实验到部署无缝衔接 在深度学习项目推进过程中,一个常见的场景是:研究员在本地调试好的模型,到了服务器上却因为“CUDA not available”或“cudnn version mismatch”报错而无法运行;又或者为了配置 PyTor…

作者头像 李华