目录

From/Size

分布式系统中深度分页的问题

Search After 避免深度分页的问题

Search After是如何解决深度分页的问题

Scroll API

不同的搜索类型和使用场景


From/Size

es的size最多有多少_elasticsearch

  • 默认情况下,查询按照相关度算分排序,返回前10条记录
  • 容易理解的分页方案
  • From: 开始位置
  • Size:期望获取文档的总数

分布式系统中深度分页的问题

es的size最多有多少_es的size最多有多少_02

  • ES天生就是分布式的.查询信息,但是数据分别保存在多个分片,多台机器上,ES天生就需要满足排序的需要(按照相关性算分)
  • 当一个查询:From = 990 ,Size=10
  • 会在每个分片上都先获取1000个文档,然后,通过Coordinating Node聚合所有的结果.最后再通过排序选取前1000个文档
  • 页数越深,占用内存越多.为了避免深度分页带来的内存.ES中有一个规定,默认限定到10000个文档(超过10000个文档就会报错)

Search After 避免深度分页的问题

  • 避免深度分页的性能问题,可以实时获取下一页文档信息
  • 不支持指定页数(From)
  • 只能往下翻
  • 第一步搜索需要指定sort,并且保证值是唯一的(可以通过_id保证唯一性)
  • 然后使用上一次,最后一个文档的sort值进行查询
  • 第一步:先获取第一次数据
  • 将sort中的数据放到search_after中
  • 将sort的结果放到search_after中 依此类推可以实现分页

Search After是如何解决深度分页的问题

es的size最多有多少_elasticsearch_03

  • 假定Size是10
  • 当查询990-1000
  • 通过 唯一排序值(search_after)定位,将每次要处理的文档数都控制在10
  • Coordinating Node在每个分片上取10条文档,通过控制文档个数避免深度分页带来的开销

Scroll API

  • scroll=5m:指定scroll存活的一个时间,创建快照
  • 创建一个快照,在这个时间段内有新的数据写入以后,无法被查到
  • 每次查询后,输入上一次的Scroll Id
  • 查看当前索引的数目
  • 第一次查询结果
  • 将前一次的id写到scroll_id里面

不同的搜索类型和使用场景

  • Regular
  • 需要实时获取顶部的部分文档.例如查询最新的订单
  • Scroll
  • 需要全部文档,例如导出全部数据
  • Pagination
  • From和Size
  • 如果需要深度分页,则选用Search After