Elasticsearch分页页数限制为100页,如何突破该限制?
Elasticsearch深分页限制的解决方法
为什么只能拿到100页?
Elasticsearch默认有个max_result_window参数,值为10000——意思是最多能返回查询结果中的前10000条数据。你每页展示10条,100*10=10000,刚好触碰到这个限制,所以只能拿到100页。
解决办法
1. 调整max_result_window参数
直接修改索引的这个参数,扩大允许的最大结果数。比如你需要800页(8000条数据),可以把值设为80000留有余量。执行以下请求:
PUT /你的索引名/_settings { "index": { "max_result_window": 80000 } }
⚠️ 注意:这个参数设置过大可能导致内存压力飙升——因为Elasticsearch需要在内存中对符合条件的所有文档排序,偏移量越大,内存消耗越高。如果你的数据量后续还会增长,不建议把这个值设得过大。
2. 使用search_after实现高效深分页
这是Elasticsearch官方推荐的深分页方案,避免了偏移量带来的内存问题。原理是用上一页最后一条文档的排序字段值作为下一页的查询起点,不需要计算总偏移量。
步骤:
- 首先查询第一页时,指定一个唯一的排序规则(比如结合业务字段和
_id,确保每条文档的排序值唯一):
GET /你的索引名/_search { "size": 10, "sort": [ {"你的排序字段": "asc"}, {"_id": "asc"} ] }
- 拿到返回结果中最后一条文档的
sort数组值(比如["2024-05-20", "doc_10"]),用这个值作为下一页的search_after参数:
GET /你的索引名/_search { "size": 10, "sort": [ {"你的排序字段": "asc"}, {"_id": "asc"} ], "search_after": ["2024-05-20", "doc_10"] }
这种方式没有深分页的性能瓶颈,但缺点是无法直接跳转到任意页码,只能逐页向后翻。
3. 旧版本可用scroll API(不推荐新版本使用)
在Elasticsearch 7.17及之前的版本,可以用scroll API创建一个数据快照,然后分批拉取结果。但这个API在新版本已被标记为废弃,且不适合实时查询场景(快照是创建时的静态数据),所以优先考虑search_after。
总结
- 若只是临时需要少量深分页,且数据规模不大,可调整
max_result_window; - 若有频繁的深分页需求,优先使用
search_after,兼顾性能和稳定性。
内容的提问来源于stack exchange,提问作者H.W.K. Aravinda
相关产品推荐
相关产品推荐

