elasticsearch size+from 在分布式系统中深度分页查询慢分析

在实际的项目中数据量较大,查询ES进行查询并做分页处理,导致当分页页码过大的时候,查询响应非常的慢,在网上找打这一个分析,记录一下!Tip在 reindex 中解释了如何 能够 有效获取大量的文档。分页在之前的 空搜索 中说明了集群中有 14 个文档匹配了(empty)query 。 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档?和 SQL 使用 LIM…

大家好,又见面了,我是全栈君。

在实际的项目中数据量较大,查询ES进行查询并做分页处理,导致当分页页码过大的时候,查询响应非常的慢,在网上找打这一个分析,记录一下!

  • Tip

    reindex 中解释了如何 能够 有效获取大量的文档。

分页

在之前的 空搜索 中说明了集群中有 14 个文档匹配了(empty)query 。 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档?

和 SQL 使用 LIMIT 关键字返回单个 page 结果的方法相同,Elasticsearch 接受 from 和 size 参数:

  • size
    显示应该返回的结果数量,默认是 10

  • from
    显示应该跳过的初始结果数量,默认是 0

如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果:

GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

考虑到分页过深以及一次请求太多结果的情况,结果集在返回之前先进行排序。 但请记住一个请求经常跨越多个分片,每个分片都产生自己的排序结果,这些结果需要进行集中排序以保证整体顺序是正确的

在分布式系统中深度分页

理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。

现在假设我们请求第 1000 页—结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121055.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卸载pycharm重新安装_ubuntu卸载pycharm

    卸载pycharm重新安装_ubuntu卸载pycharm1.安装包下载下载地址https://www.jetbrains.com/pycharm/download/#section=linux社区版是免费的,不需要支付额外的费用,但是功能略微筛选,适合于学生群体,而专业版需要支付一定的费用,功能比较多,适用于企业,但整体的安装过程相同。2.安装在安装包过程启动终端命令,解压缩下载后的安装包修改自己的安装包版本号即可$tar-zxvfpycharm-professional-2021.3.1.tar.gz将解压缩后的目录移动到/

    2022年8月29日
    2
  • 从“挂科大王”到网络安全布道者,云舒的那些“面壁”时刻[通俗易懂]

    从学习、工作和创业经历出发,走近网络安全布道者云舒的人生。

    2022年4月15日
    52
  • ROS通过话题发布订阅Image类型的视频帧(python)

    ROS通过话题发布订阅Image类型的视频帧(python)

    2020年11月8日
    279
  • AMQP机制_cdm机制为什么停止了

    AMQP机制_cdm机制为什么停止了当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本。AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。        当然这种降低耦合的机制是基于与上层产品,语言无关的协议。AMQP协议是一种二进制协议,提供

    2025年6月18日
    2
  • python中for循环的用法-Python for循环及基础用法详解

    python中for循环的用法-Python for循环及基础用法详解Python中的循环语句有2种,分别是while循环和for循环,前面章节已经对while做了详细的讲解,本节给大家介绍for循环,它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。for循环的语法格式如下:for迭代变量in字符串|列表|元组|字典|集合:代码块格式中,迭代变量用于存放从序列类型变量中读取出来的元素,所以一般不会在循环中…

    2022年8月12日
    20
  • dns地址和ip地址的区别_ip地址和域名一样吗

    dns地址和ip地址的区别_ip地址和域名一样吗IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的。写法:十进制的形式,用“.”分开,叫做“点分十进制表示法”,如:127.0.0.1。IP地址采用二进制的形式表示的话很长,比较麻烦,为了便于使用,IP地址经常被写成十进制的形式。域名:ip是数字标识,使用时不好记忆和书写,因此在将IP地址符号化…

    2022年9月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号