
## Elasticsearch 分页查询
### From + size
- 优点
- 支持随机翻页
- 缺点
- 受制于max_result_window,不能无限制翻页
- 深度翻页越慢
- 适用场景
- 小型数据集
- 主流PC搜索引擎(Top数据随机分页)
### search_after
- 优点
- 不受max_result_window限制,可无限后翻
- 缺点
- 仅支持后翻,不支持随机翻页
- 适用场景
- 类似今日头条后翻页(无随机翻页)的场景
### scroll
- 优点
- 支持全量遍历
- 不受max_result_window限制
- 缺点
- 响应非实时
- 内存占用高
- 适用场景
- 全量/大数据量遍历(非分页查询)
- 官方说明
- 不再建议用于深度分页
### 官方推荐方案:PIT + search_after
- 官方定位
- 超过10,000+结果分页检索的推荐方案
- 核心组件
- PIT(Point In Time)
- 作用:创建索引时间点快照,保障数据一致性
- 优势:仅记录索引状态,内存占用低
- search_after
- 作用:基于排序值的游标分页
- 优势:性能不受分页深度影响
- 与scroll对比
- 官方态度:推荐 vs 不再推荐
- 内存占用:低 vs 高
- 状态维护:无状态 vs 有状态
- 实时性:更好 vs 差
- 使用步骤
1. 创建PIT快照(设置keep_alive)
2. 首次搜索(用pit_id + 排序规则)
3. 后续分页(传递search_after排序值)
4. 关闭PIT释放资源
- 最佳实践
- 排序字段含唯一值(如时间戳+_id)
- 批次大小1000-5000条
- 禁用track_total_hits提升性能
- 设置合理的PIT keep_alive时间