ElasticSearch 深度分页解决方案

Elasticsearch深度分页问题 查询第一页5条数据"query": {},"from": 0,"size": 5但是如果我们查询的数据页数特别大,当from + size大于10000的时候,就会出现问题,如下图报错信息所示:ES通过参数index.max_result_window用来限制单次查询满足查询条件的结果窗口的大小,其默认值为10000。分页方式性能优点缺点适用场景低灵活性好,实现简单,支持随机翻页受制于max_result_window设置,不能无限制翻页;存在深度翻译问题,越往后翻译越慢。 阅读详情

1.常见深度分页方式 from+size

es 默认采用的分页方式是 from+ size 的形式,在深度分页的情况下,这种使用方式效率是非常低的,比如

from = 5000, size=10000, es 需要在各个分片上匹配排序并得到5000*10000条有效数据,然后在结果集中取最后10000条

数据返回.

除了效率上的问题,还有一个无法解决的问题是,es 目前支持最大的 skip 值是 max_result_window ,默认

为  10000。也就是当 from + size > max_result_window 时,es 将返回错误.

当然,我们可以采用紧急规避方案,就是调整 max_result_window 的值。

curl -XPUT "127.0.0.1:9200/custm/_settings" -d '{ "index" : { "max_result_window" : 50000 } }'

然后这种方式只能暂时解决问题,当es 的使用越来越多,数据量越来越大,深度分页的场景越来越复杂时,如何解决这种问题呢?

2.scroll 分页方式

为了满足深度分页的场景,es 提供了 scroll 的方式进行分页读取。原理上是对某次查询生成一个游标 scroll_id , 后续的查询只需要根据这个游标去取数据,直到结果集中返回的 hits 字段为空,就表示遍历结束。

scroll_id 的生成可以理解为建立了一个临时的历史快照,在此之后的增删改查等操作不会影响到这个快照的结果。

   1.先获取第一个 scroll_id,url 参数包括 /index/_type/ 和 scroll,scroll 字段指定了scroll_id 的有效生存期,以分钟为单位,过期之后会被es 自动清理。

curl -XGET 127.0.0.1:9200/db/info/_search?pretty&scroll=2m -d '{"query":{"match_all":{}}, "sort": ["_doc"]}'

   2.后续读取上一次查询返回的scroll_id 来不断的取下一页,如果srcoll_id 的生存期很长,那么每次返回的 scroll_id 都是一样的,直到该 scroll_id 过期,才会返回一个新的 scroll_id。请求指定的 scroll_id 时就不需要 /index/_type 等信息了。每读取一页都会重新设置 scroll_id 的生存时间,所以这个时间只需要满足读取当前页就可以,不需要满足读取所有的数据的时间,1 分钟足以。

curl -XGET '127.0.0.1:9200/_search/scroll?scroll=1m&scroll_id=cXDFERDGD45WEsdfd35DFEFDFX2ZnOzA

   3.所有文档获取完毕之后,需要手动清理掉 scroll_id 。虽然es 会有自动清理机制,但是 srcoll_id 的存在会耗费大量的资源来保存一份当前查询结果集映像,并且会占用文件描述符。所以用完之后要及时清理。使用 es 提供的 CLEAR_API 来删除指定的 scroll_id

删除掉所有索引上的 scroll_id    curl -XDELETE 127.0.0.1:9200/_search/scroll/_all

删掉指定的多个  srcoll_id           curl -XDELETE 127.0.0.1:9200/_search/scroll -d '{"scroll_id" : ["cXDFERDGD45WEsdfd35DFEFDFX2ZnOzA"]}'

3.search_after 的方式

上述的 scroll search 的方式,官方的建议并不是用于实时的请求,因为每一个 scroll_id 不仅会占用大量的资源(特别是排序的请求),而且是生成的历史快照,对于数据的变更不会反映到快照上。这种方式往往用于非实时处理大量数据的情况,比如要进行数据迁移或者索引变更之类的。那么在实时情况下如果处理深度分页的问题呢?es 给出了 search_after 的方式,这是在 >= 5.0 版本才提供的功能。

search_after 分页的方式和 scroll 有一些显著的区别,首先它是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。

为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,这种分页方式其实和目前 moa 内存中使用rbtree 分页的原理一样,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以。

     第一页的请求和正常的请求一样

    curl -XGET 127.0.0.1:9200/db/info/_search

   {
    "size": 10,
    "query": {
        "term" : {
            "did" : 333
        }
    },
    "sort": [
        {"createdate": "asc"},
        {"_uid": "desc"}
    ]
}

     第二页的请求,使用第一页返回结果的最后一个数据的值,加上 search_after 字段来取下一页。注意,使用 search_after 的时候要将 from 置为 0 或 -1

curl -XGET 127.0.0.1:9200/order/info/_search
{
    "size": 10,
    "query": {
        "term" : {
            "did" : 333
        }
    },
    "search_after": [1463533345, "2039488283-ALT"],
    "sort": [
        {"createdate": "asc"},
        {"_uid": "desc"}
    ]
}

总结:search_after 适用于深度分页+ 排序,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。

ElasticSearch深度分页原理及解决方案 简单来说,就是搜索的特别深,比如总共有100000条数据,四个primary shard,每个shard上分了25000条数据,每页是10条数据,这个时候,你要搜索到第1000页,实际上要拿到的是10001~10010,为了获取这些深层次页面的数据,系统通常需要先查询并处理前面所有页面的数据,以确保能够正确地显示用户所请求的页面,这个过程可能导致查询范围非常广泛,从而显著降低查询效率,增加服务器负担。3.数据不稳定性:在深度分页过程中,如果有新的文档被索引或删除,可能会导致结果的不稳定性。 阅读详情

相关推荐

ElasticSearch中的深度分页问题

"from": 0,"size": 10from:跳过的记录数size:返回的记录数例如,from=1000和size=10表示跳过前 1000 条记录,从第 1001 条开始获取 10 条记录。当from参数的值很大时(如from=10000以上),ElasticSearch 需要跳过大量数据来获取指定页的内容,这种情况称为深度分页。

qq_46248151的博客 2414

es--Elastic Search深度分页问题分析及四种解决方案

Scroll API是Elasticsearch提供的一种用于深度分页的解决方案。它允许您从数据集中获取大量数据而不会使用过多的资源。Scroll API通过分批次读取数据,将查询拆分为多个小块,并在每个小块完成后将其提交到Web浏览器。这意味着您可以一次性检索大量文档,而不必担心过多的资源使用和系统崩溃。Search After是Elasticsearch提供的另一种用于深度分页的解决方案。它允许您非常快速地检索大量数据并避免使用scroll API。

qq_62357662的博客 6983

京东面试题:ElasticSearch 深度分页解决方案

在7.*版本中,ES 官方不再推荐使用 Scroll 方法来进行深分页,而是推荐使用带 PIT 的来进行查询;从7.*版本开始,您可以使用参数通过上一页中的一组排序值检索下一页命中。使用需要多个具有相同查询和排序值的搜索请求。如果这些请求之间发生刷新,则结果的顺序可能会更改,从而导致页面之间的结果不一致。为防止出现这种情况,您可以创建一个时间点(PIT)来在搜索过程中保留当前索引状态。返回一个PIT ID:{}复制代码{"query": {}},"pit": {},

Q54665642ljf的博客 345

ES 深度分页问题及针对不同需求下的解决方案(Deep paging)

1、什么是深度分页(Deep paging)? 1.1 ES中from+size分页 分页问题是Elasticsearch中最常见的查询场景之一,正常情况下分页代码如实下面这样的: GET order_2290w/_search { "from": 0, "size": 5 } 输出结果如下图: 很好理解,即查询第一页的5条数据。图中数字2即返回的五条文档数据。但是如果我们查询的数据页数特别大,达到什么程度呢?当from + size大于10000的时候,就会出现问题,如下图报错信息所示: 报

Elastic开源社区 1万+

图像修复黑科技:对比BM3D/DnCNN等5种去噪器在PNP框架中的实战效果

本文深度评测了BM3D、DnCNN等五款主流去噪器在即插即用(PnP)优化框架中的实战表现。通过量化指标、视觉对比及超分等泛化任务测试,揭示了深度学习模型在性能与收敛速度上的优势,并为不同应用场景提供了选型指南与工程化建议。

weixin_29065959的博客 369

机器学习第四个算法ANN(人工神经网络)

我是在14年9月刚读研的时候听到一个说法叫“类人脑算法”很火热,之后搞了很长一段时间相关的蓄水池算法等,但大都没有摸到门路而中途放弃了。现今看来,还是缺少一些知识背景,也不善于在网络上学习,随时间推移,也逐渐明白这是机器学习的一小部分,并且逐渐发展的名称叫做人工神经网络的算法,如果网络层较多,又会有个别名,叫做深度学习。其中个用到的最著名的算法是背向传输算法(backpropagation),而这个

legalhighhigh的博客 1万+

【ElasticSearch】ElasticSearch 深度分页解决方案

yi ElasticSearch 深度分页解决方案

后端研发工程师Marion的博客 343

Kotlin原生AI Agent框架Koog:为JVM开发者打造类型安全、企业级智能体开发方案

AI Agent作为当前人工智能应用开发的核心范式,通过赋予大语言模型(LLM)自主规划、工具调用和环境交互能力,正在重塑软件智能化进程。其技术原理基于智能体架构,通过提示工程、函数调用和记忆机制,将LLM从单纯的文本生成器转变为能够执行复杂任务的工作流引擎。这一技术价值在于显著降低了构建智能应用的开发门槛,同时保持了高度的灵活性和可扩展性。在实际应用场景中,AI Agent广泛落地于智能客服、代码助手、数据分析自动化等领域,成为连接大模型能力与具体业务需求的关键桥梁。本文聚焦的Koog框架,正是针对JVM

weixin_42594419的博客 395

分布式专题——51 ES 深度分页问题及其解决方案详解

深度分页、深度分页不推荐使用from+size、深度分页问题的常见解决方案(尝试避免使用深度分页、Scroll Search滚动查询、search_after查询)、ES的三种分页方式总结

念头通达 1201

PSIM联合VS--C++实现正弦波发生

在利用VS联合PSIM仿真中,想要用VS构建一个正弦波发生模块。可以利用Sin函数进行编写,重点是需要编写一个计数器程序。首先打算用for循环语句来构建计数器,但在for循环运行时无法跳出,不能实时获得计数器的值。同理,while循环也无法实现。最后将count变量设置为static型,解决了这一问题。 体现出对于c++程序的运行不够了解,需要多进行程序的编写和调试。 //时钟计数器 static int count = 0; count++; if (count > Sinfre)

weixin_41850228的博客 1087

“华为杯”研究生数学建模竞赛2020年-【华为杯】D题:无人机集群协同对抗(附获奖论文和MATLAB代码实现)

1.问题重述摘 要:本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。,构建了。我们综合考虑了,和。首先分析红方在集群约束下的贪婪队形和拦截策略,然后我们基于内点法联合MATLAB和AMPL编程求解蓝方突防的非线性规划解,最后基于蒙特卡洛法对整个蓝方突防过程进行推演,得到突防概率图。通过推演,我们提出了两块的区域作为所求区域,并对蓝方的最优突防策略进行分析。

getusushu的博客 1551

ElasticSearch深度分页解决方案

ElasticSearch是一个基于Lucene的搜索引擎,它支持复杂的全文搜索和实时数据分析。在实际应用中,我们经常需要对大量数据进行分页查询,但是传统的分页方式在处理大量数据时会遇到性能瓶颈。本文将介绍ElasticSearch分页工作原理、深度分页存在的问题以及深度分页解决方案。

weixin_40381772的博客 3811

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 197

Elasticsearch 深度分页问题全解析与高效解决方案

深度分页指的是 from+size 的分页方式中,from 参数很大(如 from=10000,size=10),即请求“很深”页的数据。深度分页本质:from+size 随数据量线性变慢,性能瓶颈明显。主流解决方案:Scroll 适合大批量导出,Search After 适合实时高效翻页。核心技巧:排序字段唯一、游标及时清理、业务层限制深翻。架构演进:Scroll 解决大数据批量,Search After 解决实时高效,底层依托 Lucene 的排序与游标机制。实战认知。

IT技术学习与工作笔记分享 1302

3D LUT Color Conversion之总体架构设计之三

摘要:本文提出了一种基于三维坐标一维化寻址的四面体网格编码方法。通过定义全局网格坐标P(R,G,B)=R+9G+81B和局部增量(ξ,η,ζ)∈{0,1},推导出偏移量Δ(ξ,η,ζ)=ξ+9η+81ζ的平移不变性质。该方法将6种坐标排序情况(Case)对应的固定偏移量三元组预先存储,其中V0和V3的偏移量恒定为0和91。硬件实现时只需根据Case选择对应常量组,无需实时计算坐标,显著提高了处理效率。该方案利用线性寻址公式的特性,确保相同局部结构在不同位置具有一致的偏移模式。(149字)

大熊 48

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

京东面试题:ElasticSearch深度分页解决方案

分页方式性能优点缺点场景低灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题scroll中解决了深度分页问题无法反应数据的实时性(快照版本)维护成本高,需要维护一个 scroll_id海量数据的导出需要查询海量结果集的数据高性能最好不存在深度分页问题能够反映数据的实时变更实现复杂,需要有一个全局唯一的字段连续分页的实现会比较复杂,因为每一次查询都需要上次查询的结果,它不适用于大幅度跳页查询海量数据的分页。

sjkflw121150的博客 636

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ES的深度分页解决方案

索引:共4T,5个索引,共100亿条数据查询语句:{ "query":{ "term":{ "app_s...

春哥大魔王的博客 8093

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Elasticsearch深度分页解决方案

在Elasticsearch的实际应用中,高效的分页查询是开发者经常面临的挑战。当数据量达到百万甚至千万级别时,传统的分页方式会遭遇严重的性能瓶颈。和,从原理到实践,帮助您彻底掌握这两种技术。

2401_89221867的博客 1222

Elasticsearch深度分页问题及其解决方案详解

Elasticsearch深度分页问题及其解决方案 深度分页是Elasticsearch处理大数据集查询时遇到的性能瓶颈问题,主要表现为翻页越深性能越差。ES默认限制max_result_window为10000条记录以防止内存溢出。本文分析了三种解决方案:1)from+size方式简单但性能差;2)scrollAPI适合全量遍历但非实时;3)search_after性能最佳但仅支持顺序翻页。

alonewolf_99的博客 1430

ES 深度分页问题及解决方案

深度分页问题大致可以分为两类 随机深度分页:随机跳转页面 滚动深度分页:只能一页一页往下查询

wangxuelei036的博客 1万+

Elasticsearch 深度分页踩坑指南:从报错到终极解决方案

方案推荐指数适用阶段调整 max_result_window⭐☆☆☆☆早期验证阶段Scroll API⭐⭐☆☆☆临时数据迁移/批量导出⭐⭐⭐⭐⭐生产环境实时分页在日志分析、用户行为追踪等场景中,结合 search_after + 时间范围过滤 + 适当的缓存策略,可实现亿级数据的高效分页。立即升级你的分页方案,告别 Result window is too large 报错!公众号:【码农小站】

kuang_wu的专栏 1140

ES_深度分页概念与解决方案

但是elasticsearch将来一定是集群,例如我集群有5个节点,我要查询TOP1000的数据,并不是每个节点查询200条就可以了:因为节点A的TOP200,在另一个节点可能排到10000名以外了。当查询分页深度较大时,汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。因此要想获取整个集群的TOP1000,必须先查询出每个节点的TOP1000,汇总结果后,重新排名,重新截取TOP1000。_id是文档的唯一标识,是不重复的。

zelxnxy的博客 223

Java架构直通车——ElasticSearch深度分页解决方案

文章目录分页查询深度分页深度分页解决方案 分页查询 分页查询是这样的: POST /shop/_doc/_search { "query": { "match_all": {} }, "from": 0, "size": 10 } 不过,当查询是这样时,会报错: POST /shop/_doc/_search { "quer...

No_Game_No_Life_的博客 1443
上一篇: mysql 查询时utf8mb4格式的字段报错 指定关键字不存在
下一篇: ElasticSearch 查询 match 无法精确查找 match用term代替
nb009网
博客等级 码龄18年 10粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值