首页/数据/NoSQL 速查/search_after 深分页
Elasticsearch89 条

search_after 深分页

search_after 用上一页最后一个文档的排序值作为下一页起点,避免 from+size 的深分页开销;排序字段组合必须能确定唯一顺序,常加 _id 或时间戳做兜底。

NoSQL 速查数据更新于 2026-10-12
原理携带上一页末尾的 sort 值继续查询,不计算前面所有页
必要条件排序键组合全局稳定且唯一,推荐业务时间 + _id
限制不能跳页,只能顺序向后翻

示例

示例
# 首页
GET /my-index/_search
{
  "size": 10,
  "sort": [ { "publish_date": "desc" }, { "_id": "asc" } ],
  "query": { "range": { "publish_date": { "gte": "2024-01-01" } } }
}
# 下一页:把上一页最后一条的 sort 值依次填入
GET /my-index/_search
{
  "size": 10,
  "sort": [ { "publish_date": "desc" }, { "_id": "asc" } ],
  "search_after": [1719792000000, "doc-42"]
}
配合 PIT 使用时用 _shard_doc 作为兜底排序键,可以在翻页期间给索引一个稳定视图。

易错点

  • search_after 的值必须与 sort 顺序一一对应,少填一项会报参数数量不匹配
  • 用 _id 做兜底时如果文档会被更新重建,翻页期间的顺序仍可能漂移,需要 PIT 固定视图

数据来源与参考

  • Elasticsearch Guide: Paginate search results (search_after)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌