深度分页与遍历
本章定位:from+size 分页在第 10000 条之后就会报错。本章覆盖三种不限制深度的方案:search_after、scroll 和 point in time (PIT)。
定义与作用
深度分页指在 ES 中获取第 N 页之后的数据(N 很大)。from+size 会造成协调节点内存和 CPU 压力过大,因为需要从每个分片取 N+size 条并全局排序。
ES 默认限制 max_result_window: 10000。
完整示例:三种遍历方案
search_after(实时分页,推荐)
POST /students/_search
{
"size": 20,
"sort": [{ "score": "desc" }, { "_id": "asc" }],
"search_after": [95, "1000"]
}
scroll(批处理/全量导出)
POST /students/_search?scroll=5m
{ "size": 1000, "query": { "match_all": {} } }
POST /_search/scroll
{ "scroll": "5m", "scroll_id": "DXF1ZXJ5..." }
PIT(ES 7.10+,最优雅)
POST /students/_pit?keep_alive=5m
POST /_search
{
"size": 100,
"pit": { "id": "...", "keep_alive": "5m" },
"sort": [{ "_shard_doc": "asc" }],
"search_after": [2, "..." ]
}
小结
场景选择:实时分页→search_after;全量导出→scroll 或 PIT+search_after;无需求则限制 max_result_window 防 OOM。