es提供了3种方式来解决分页与遍历的问题:
- from/size
- scroll
- search_after
From/Size
- 获取从 990 ~ 1000 的文档,会在每个分片上都先获取前1000个文档,然后再由Coordinating Node 聚合所有分片的结果后再排序选取前1000个文档。
- 分页越深,处理文档越多,占用的内存越多,耗时越长。尽量避免深度分页,es通过 index.max_result_window限定最多到10000条数据
Scroll
遍历文档集的api,以快照的方式来避免深度分页的问题
- 不能用来做实时搜索,因为数据不是实时的
- 尽量不要使用复杂的sort 条件,使用 _doc 最高效
- 使用稍显复杂
第一步需要发起1个scroll search,es在收到该请求后会根据查询条件创建文档ID合集的快照
Search_After
避免深度分页的性能问题,提供实时的下一页文档获取功能
- 缺点是不能使用from参数,即不能指定页数
- 只能下一页,不能上一页
- 使用简单
- 第一步为正常的搜索,但要指定sort值,并保证值的唯一
-
第二步为使用上一步最后一个文档的sort值进行查询