Elasticsearch之分页与遍历

es提供了3种方式来解决分页与遍历的问题:
  - from/size
  - scroll
  - search_after

From/Size

From/Size
From/Size是最常用的分页方案,from 指明开始的位置,size 指明获取总数。深度分页是一个经典的问题:在数据分片存储的情况下如何获取前1000文档?
  - 获取从 990 ~ 1000 的文档,会在每个分片上都先获取前1000个文档,然后再由Coordinating Node 聚合所有分片的结果后再排序选取前1000个文档。
  - 分页越深,处理文档越多,占用的内存越多,耗时越长。尽量避免深度分页,es通过 index.max_result_window限定最多到10000条数据
From/Size

Scroll
遍历文档集的api,以快照的方式来避免深度分页的问题
  - 不能用来做实时搜索,因为数据不是实时的
  - 尽量不要使用复杂的sort 条件,使用 _doc 最高效
  - 使用稍显复杂
第一步需要发起1个scroll search,es在收到该请求后会根据查询条件创建文档ID合集的快照
scroll
第二步调用scroll search 的 api,获取文档的集合,不断迭代调用直到返回 hit.hits数组为空时停止
scroll
过多的scroll调用会占用大量的内存,可以通过 clear api 删除过多的scroll 快照
clear api

Search_After
避免深度分页的性能问题,提供实时的下一页文档获取功能
  - 缺点是不能使用from参数,即不能指定页数
  - 只能下一页,不能上一页
  - 使用简单

  • 第一步为正常的搜索,但要指定sort值,并保证值的唯一
  • 第二步为使用上一步最后一个文档的sort值进行查询
    Search_After
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容