news 2026/1/13 15:21:39

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/1/12 2:35:03

Markdown写技术博客必备:PyTorch-CUDA-v2.7环境记录模板

PyTorch-CUDA-v2.7 环境构建实战:从理论到部署的全链路解析 在深度学习项目中,最令人头疼的往往不是模型设计本身,而是“为什么我的代码在别人机器上跑不起来?”——这个看似简单的问题背后,隐藏着版本依赖、驱动兼容、…

作者头像 李华
网站建设 2026/1/12 2:05:17

PyTorch-CUDA-v2.7镜像中通过‘git commit’等术语吸引程序员群体

PyTorch-CUDA-v2.7 镜像:用程序员的语言打造深度学习开发环境 在今天这个 AI 开发日益“工业化”的时代,一个项目能否快速启动,往往不取决于模型多先进,而在于——你的环境能不能五分钟内跑起来。 想象这样一个场景:新…

作者头像 李华
网站建设 2026/1/11 14:01:49

论文AI率压不下去?这十大降AI工具真有用

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

作者头像 李华
网站建设 2026/1/12 4:08:58

PyTorch-CUDA-v2.7镜像中使用Sentence-BERT生成嵌入向量

PyTorch-CUDA-v2.7镜像中使用Sentence-BERT生成嵌入向量 在当今的自然语言处理实践中,一个常见的挑战是:如何快速、稳定地将大量文本转换为高质量的语义向量?尤其是在资源有限或部署环境复杂的场景下,开发者往往被繁琐的依赖配置和…

作者头像 李华
网站建设 2026/1/12 3:10:26

FlashAI终极部署实战:5分钟打造私有化智能助手

FlashAI终极部署实战:5分钟打造私有化智能助手 【免费下载链接】通义千问 FlashAI一键本地部署通义千问大模型整合包 项目地址: https://ai.gitcode.com/FlashAI/qwen 在数据安全日益重要的今天,企业迫切需要既能保护隐私又能提供强大AI能力的解决…

作者头像 李华