Elasticsearch 深分页限制与解决方案
最近在准备面试,正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解,以及高频业务场景的应对策略系统梳理一遍,既能加深记忆,也能让知识体系更扎实,供大家参考,欢迎讨论。
在项目中遇到一个问题:之前同事在导出所有 IM 消息时,直接用 分页查询(from + size) 拉全量数据,当数据加起来超过1万条后,Elasticsearch 报错:
Result window is too large, from + size must be less than or equal to: [10000] but was [11000].
See the scroll api for a more efficient way to request large data sets.
这就是 ES 默认的 深分页限制 导致的。
一、问题原因
Elasticsearch 默认的 index.max_result_window 设置为 10000。
查询时,如果 from + size > 10000,就会报错。注意是 from + size 一起不能超过10000条。
默认分页只适合小数据量查询,不适合一次性拉取所有数据。
二、解决方案
1. 临时调整 index.max_result_window
通过修改索引配置提高限制,例如:
PUT 索引名称/_settings?preserve_existing=true
{
“index.max_result_window”: “50000”
}
⚠️ 这种方式会增加 ES 的内存和 CPU 消耗,不建议无限放大。
2. 调整java代码使用 Scroll API
适合批量拉取大量数据,特点:
返回的是快照数据,不随实时更新。
用完要清理 scroll 上下文。
更适合离线导出、批处理。
三、经验总结
分页查询(from+size)只适合小数据量场景,不适合全量查询。
大数据导出 → Scroll API
实时分页展示 → Search After
特殊情况 → 调整 index.max_result_window(需谨慎)。
✅ 这次踩坑,就是因为用分页直接查全量数据,超过了 ES 的默认限制。后续我们改用 Scroll API,顺利解决。