ElasticSearch 深度分页 (史上最全、面试必备)

Elasticsearch 深度分页:from&size、Scroll与SearchAfter详解
本文详细介绍了Elasticsearch中处理深度分页的三种方法:from&size、Scroll滚动游标和SearchAfter。from&size在大数据量时会导致性能问题和OOM,而Scroll适用于非实时的大数据导出,SearchAfter则适合实时查询并支持排序。文章还探讨了各种方法的优缺点及适用场景。

文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源:

SpringCloud 微服务 精彩博文
nacos 实战(史上最全) sentinel (史上最全+入门教程)
SpringCloud gateway (史上最全) 分库分表sharding-jdbc底层原理与实操(史上最全,5W字长文,吐血推荐)

ElasticSearch 深度分页 (史上最全)

说明:此文来自社群小伙伴的呼声

说明:
ElasticSearch 深度分页 是面试的高频题目,社群小伙伴要求,尼恩写个博客来介绍一下,于是,此文就出来了

三大ElasticSearch分页方式

  • 传统方式(from&size)

    顶部查询,查询10000以内的文档
    场景:需要实时获取顶部的部分文档。

    eg: 例如查询最新的订单。

  • Scroll 滚动游标 方式

    深度分页,用于非实时查询场景
    eg:需要全部文档,例如导出全部数据

  • Search After
    深度分页,用于实时查询场景

    注意es版本,低版本不能使用,具体见后文

from&size分页

POST movies/_search
{
   
   
  "from": 10000,
  "size": 10,
  "query": {
   
   
    "match_all": {
   
   

    }
  }
}

这是ElasticSearch最简单的分页查询 , from + size10000 +10需要查询的文档从10000 到 10010

以上命令是会报错的。

"root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Result window is too large, from + size must be less than or equal to: [10000] but was [10001]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting."
      }
    ],
    "type": "search_phase_execution_exception",

报错信息,指window默认是10000。

from&size为何不能获取10000个以上的文档

性能

为了性能,es限制了我们分页的深度,

es目前支持的最大的 max_result_window = 10000;

也就是说我们不能获取10000个以上的文档 , 当ES 分页查询超过一定的值(10000)后,会报错

怎么解决这个问题,首先能想到的就是调大这个window。

PUT movies/_settings
{ 
    "index" : { 
        "max_result_window" : 20000
    }
}

但这种方法只是暂时解决问题,当数据量越来越大,分页也越来越深,而且越会出OOM问题的。

from&size分页为何会OOM

协调节点或者客户端节点,需要讲请求发送到所有的分片

每个分片把from + size个结果,返回给协调节点或者客户端节点‘

协调节点或者客户端节点进行结果合并,如果有n个分片,则查询数据是 n * (from+size) , 如果from很大的话,会造成oom或者网络资源的浪费。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KimXpike-1647609673794)(https://segmentfault.com/img/bVbxJQD?w=706&h=412)]

例子

如请求第20页,Elas

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值