news 2026/5/15 1:39:30

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/5/7 10:38:26

PyTorch-CUDA-v2.7镜像对显存要求高吗?实测告诉你

PyTorch-CUDA-v2.7 镜像显存占用高吗?实测告诉你真相 在深度学习项目中,你是否也遇到过这样的困惑:刚启动一个容器,nvidia-smi 就显示 GPU 显存已经被占掉几百 MB?是不是这个“PyTorch-CUDA-v2.7”镜像本身就很“吃”显…

作者头像 李华
网站建设 2026/5/10 10:18:59

PyTorch-CUDA-v2.7镜像中对比传统‘pytorch安装’方式的十大优势

PyTorch-CUDA-v2.7镜像中对比传统‘pytorch安装’方式的十大优势 在深度学习项目启动的前48小时里,你是否经历过这样的场景:刚配置完NVIDIA驱动,系统却因版本冲突重启失败;好不容易装上PyTorch,torch.cuda.is_availab…

作者头像 李华
网站建设 2026/5/3 8:02:30

PyTorch-CUDA-v2.7镜像中实现模型版本控制与回滚机制

PyTorch-CUDA-v2.7 镜像中实现模型版本控制与回滚机制 在深度学习项目日益复杂、迭代节奏不断加快的今天,一个看似微小的环境差异——比如 PyTorch 版本从 2.6 升级到 2.7,或者 CUDA 工具包的小幅更新——就可能导致训练结果不可复现,甚至让整…

作者头像 李华
网站建设 2026/5/13 8:10:27

孩子已经近视了,还有必要防控吗?

很多家长都有这样的疑问:“孩子已经近视了,眼镜也戴上了,再做防控还有意义吗?”其实答案很明确——不仅有必要,而且是重中之重。要知道,儿童青少年的眼睛还在发育,近视一旦发生,若不…

作者头像 李华
网站建设 2026/5/1 3:29:34

PyTorch-CUDA-v2.7镜像适合初学者入门深度学习吗

PyTorch-CUDA-v2.7镜像适合初学者入门深度学习吗 在尝试跑通第一个神经网络模型时,你是否曾被“CUDA not available”的报错卡住数小时?是否为了安装 PyTorch 和匹配 CUDA 版本翻遍论坛、反复卸载重装?对于刚踏入深度学习领域的初学者来说&a…

作者头像 李华
网站建设 2026/5/12 2:39:43

十佳降AI工具合集,知网维普都能用,真实自用无广

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

作者头像 李华