如何在Elasticsearch中进行深分页

业务背景

在传统业务系统中,一个常见的信息展现方式就是“分页列表”,随着数据量的增大,就会遇到“深分页”问题。比如用户一页一页的翻,一直翻到第5万页。比如导出全部列表数据到excel,实现时一页一页的把数据追加到excel,直到导出全部数据。“深分页”通常的一个问题就是:随着页数越来越大,ES或者关系数据库响应越来越慢,甚至内存溢出OOM!其中的原理是什么呢?如何在ES中进行深分页呢?

技术原理

  • 分页的本质
    分页的本质是从“大的数据集”中取出一部分。比如10000条记录,每页10条数据。取第二页即第11条到20条数据。ES或者数据库怎么知道哪些数据是第二部分(第2页),哪些是第三部分(第3页)呢?答案是ES或者数据库不知道,所以正确的分页必须要指定分页的顺序,即要有order by或者sort语句

  • 单机数据库系统分页
    单机数据库系统有一种分页实现叫做“先正序排后倒排序排”。即先对"offset+limit"的数据集根据order字段正序排列,然后再倒序找到limit条数据。

  • 分布式数据库系统分页

分布式数据库系统相对于单机数据库系统,在各个节点取出limit条数据后,还要将各个节点的"limit"条数据汇总到master节点。由master节点对limit*N(节点数)再排序,找到最终的limit条数据返回给应用程序。所以在深分页时,offset+limit过大,要排序的数据过多,对于内存分页数据库很容易超过进程的内存限制,产生OOM!

分页方式

在ES中有三种方式可以实现分页:from+size、scroll、search_after

  • from+size
    ES的标准分页方法是from+size。from相当于postgresql的offset,size相当于limit的作用。每页10条数据,获取第11页的数据,其语法如下:
POST rzfx-sqlinfo/sqlinfo/_search
{"query": {"bool": {"must": [{"term": {"architect.keyword": {"value": "郭锋"}}},{"range": {"NRunTime": {"lte": 100}}}]}},"size": 10,"from": 100
}

ES为了保证分页不占用大量的堆内存,避免OOM,参数 index.max_result_window 设置了 from+size的最大值为10000。即每页10条的话,最多可以翻到1000页。index的全部参数可以通过以下语句查看:

GET /rzfx-sqlinfo/_settings?flat_settings=true&include_defaults=true

对于结构比较简单、size比较小的文档,可以适当的扩大index.max_result_window参数,部分实现深分页。

  • scroll

  • search_after

最佳实践

转载于:https://www.cnblogs.com/wangzhen3798/p/10070977.html

如何在Elasticsearch中进行深分页相关推荐

  1. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...

  2. 【Elasticsearch】如何在Elasticsearch中使用排名评估API

    1.概述 翻译:https://www.elastic.co/cn/blog/made-to-measure-how-to-use-the-ranking-evaluation-api-in-elas ...

  3. 如何在elasticsearch里面使用深度分页功能

    2019独角兽企业重金招聘Python工程师标准>>> 前面的文章提到过es默认的from+size的分页方式返回的结果数据集不能超过1万点,超过之后返回的数据越多性能就越低. 这是 ...

  4. 教你如何在 elasticsearch 中重建索引

    序言 Elasticsearch 是一个实时的分布式搜索分析引擎.Teambition 使用 Elastisearch 作为搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,我们需要使用PUT ...

  5. 【Elasticsearch】如何在 Elasticsearch 中查找并移除重复文档

    1.概述 转载:https://www.elastic.co/cn/blog/how-to-find-and-remove-duplicate-documents-in-elasticsearch 将 ...

  6. 【Elasticsearch】如何在 Elasticsearch 中轻松编写脚本

    随着 Elasticsearch 5.x 的发布,Painless 出现了,这是 Elasticsearch 对安全.可靠和高性能脚本编写的回答.我们将向您介绍 Painless 并向您展示它的功能. ...

  7. Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能

    同义词用于提高搜索质量并扩大匹配范围. 例如,搜索 England 的用户可能希望找到包含 British 或 UK 的文档,尽管这三个词完全不同. Elasticsearch 中的同义词功能非常强大 ...

  8. .jar中没有主清单属性_如何在springboot中使用PageHelper分页插件

    目录: PageHelper简介 使用maven引入相关的jar 配置PageHelper方言 编写业务逻辑代码 PageInfo类中几个常用属性的注释 一. PageHelper简介 PageHel ...

  9. 【Elasticsearch】如何在Elasticsearch中查找相似的术语

    1.概述 翻译:https://qbox.io/blog/how-to-find-similar-terms-in-elasticsearch-suggest 本文有相似的文章:[Elasticsea ...

最新文章

  1. 单目摄像头检测6D姿态
  2. raid5 增加一块硬盘_Raid5热备盘上线同时另一块硬盘离线如何恢复数据
  3. 使用OClint进行iOS项目的静态代码扫描
  4. java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据
  5. 数据链路层: HDLC
  6. leetcode 867. 转置矩阵
  7. r语言 小树转化百分数_“小树”机器人1.0新品发布会
  8. 虚拟机VMware Workstation安装Linux服务器Debian11系统详细教程
  9. 郑州大学计算机专业本科毕业去向,河南6所高校毕业生月薪公布 :河大最高 郑大垫底...
  10. GCD之barrier
  11. 后端基础概念:各种OCV一网打尽(下篇)
  12. JavaSE基础———对象数组和集合Collection
  13. 迄今以来在硅谷的最大押注:摩根大通雇超千人专注金融科技
  14. 计算机分区无法删除,电脑硬盘分区无法修改的解决方法分析
  15. 吴恩达机器学习笔记目录
  16. factorytalk找不到OPC服务器,simatic net 做远程opc服务器问题
  17. 流程图软件lauto_流程图软件(Iauto)
  18. python元组创建_python新建元组
  19. Docker之MySQL主从连接提示:Communications link failure
  20. 软件测试颗粒度,测试用例之度——系列之颗粒度(上)

热门文章

  1. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第四题:约瑟夫环
  2. Python3学习笔记(一)简介 、 安装 、 解释器
  3. ubuntu下超级用户和普通用户
  4. 【Qt】QModbusServer类
  5. 大工14春 计算机文化基础 在线测试,大工14春《计算机文化基础》在线测试I含答案.doc...
  6. java继承类型的用法_详解Java中使用externds关键字继承类的用法
  7. c语言取奇数位构成新数,2、给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中.高位...
  8. 记录x86调试命令总结
  9. 关于界面软件测试点,电子商务网站--界面测试的测试点
  10. mysql数据库添加索引和去重