本文主要参考:

1、https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
2、《Elasticsearch权威指南》
 
好,下面上货。
 
首先介绍一下,什么是深分页问题。
当使用elasticsearch进行分页查询的时候我们使用的语法是这样的:
POST xytest/sutdent/_search
{
  "from": 0,
  "size": 2
}
 
这样的查询在10000-50000条数据(1000到5000页)以内的时候还是可以的,但是如果数据过多的话,就会出现深分页问题。这个问题和elasticsearch的内部原理有关。比如,现在要取第5001页的数据,在分页的时候,elasticsearch需要首先在每一个节点上取出50020的数据,然后和每一个节点的所有数据进行排序,取出排序后在50010到50020的数据,然后返回。这样随着数据量的增大,每次分页时排序的开销会越来越大。
 
为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式,这个滚动的方式原理就是通过每次查询后,返回一个scroll_id。根据这个scroll_id 进行下一页的查询。可以把这个scroll_id理解为通常关系型数据库中的游标。但是,这种scroll方式的缺点是不能够进行反复查询,也就是说,只能进行下一页,不能进行上一页。
 
经过分析,如果数据达到了50000条以上,那么用户基本上是不会考虑每条都去看的,用户需要的是最后对数据分析处理后的结果。而如果小于50000条的时候我们可以使用from size的方式进行分页的查询。那么这种方式存在是为了什么情景呢。应该是为了分批次的检索所有数据。
 
下面,介绍一下如何使用这种scroll的方式进行分页查询。
我们的环境里一共有6条数据,我们每次取出4条。
 
1、首先取出前4条,并且得到scroll_id(这里的3m代表的是持续滚动时间,如果过了3分钟,还没有查询下一页,那么这个scroll_id就会失效)。
POST /xytest/sutdent/_search?scroll=3m
{
    "size": 4
}
 
再次查询下一页,注意,这里查询时不需要指定index,只需要指定scroll_id和本次的持续滚动时间。
POST /_search/scroll
{
    "scroll" : "3m",
    "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAueFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALnBY2aC03d1BKbVFxV0dmejZuYmdxampRAAAAAAAAC58WNmgtN3dQSm1RcVdHZno2bmJncWpqUQAAAAAAAAudFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALoBY2aC03d1BKbVFxV0dmejZuYmdxampR"
}
 
发现这次只有两条数据,我们再次根据返回的scroll_id查询
POST /_search/scroll
{
    "scroll" : "3m",
    "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAueFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALnBY2aC03d1BKbVFxV0dmejZuYmdxampRAAAAAAAAC58WNmgtN3dQSm1RcVdHZno2bmJncWpqUQAAAAAAAAudFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALoBY2aC03d1BKbVFxV0dmejZuYmdxampR"
}
 
已经没有数据了,说明已经滚动到最后了。
这个时候我们可以删除这个scroll_id。
使用如下方法:
DELETE /_search/scroll/DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAueFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALnBY2aC03d1BKbVFxV0dmejZuYmdxampRAAAAAAAAC58WNmgtN3dQSm1RcVdHZno2bmJncWpqUQAAAAAAAAudFjZoLTd3UEptUXFXR2Z6Nm5iZ3FqalEAAAAAAAALoBY2aC03d1BKbVFxV0dmejZuYmdxampR
 
 
也可以删除所有scroll_id:
DELETE /_search/scroll/_all

【分页问题】elasticsearch 深分页问题以及解决方法的更多相关文章

  1. Linux安装ElasticSearch启动报错的解决方法

    Linux安装ElasticSearch后,ElasticSearch是不能用root用户启动的,以root用户启动会报错Refer to the log for complete error det ...

  2. Elasticsearch由浅入深(七)搜索引擎:_search含义、_multi-index搜索模式、分页搜索以及深分页性能问题、query string search语法以及_all metadata原理

    _search含义 _search查询返回结果数据含义分析 GET _search { , "timed_out": false, "_shards": { , ...

  3. phpcms V9二级目录下分页路径不正确问题的彻底解决方法

    在用phpcms V9做二次开发的时候,我们有时候会把一个栏目生成到根目录下,而且这个栏目又有子栏目,我们生成静态的时候分页会出现问题,就是分页的路径的地址错误.有一种解决方法就是,把这个栏目生成动态 ...

  4. ES 25 - Elasticsearch的分页查询及其深分页问题 (deep paging)

    目录 1 分页查询方法 2 分页查询的deep paging问题 1 分页查询方法 在GET请求中拼接from和size参数 // 查询10条数据, 默认从第0条数据开始 GET book_shop/ ...

  5. ireport 导出excel 分页 和 文本转数字格式的解决方法

    景:ireport 画excel 报表,导出时要求 数据分页,每页包含 标题和页脚 1.画excel 2.处理分页 首先建立一个变量totalNum 用于记录总共有多少条记录,注意设置属性为Integ ...

  6. Elasticsearch from/size-浅分页查询-深分页 scroll-深分页search_after深度查询区别使用及应用场景

    Elasticsearch调研深度查询 1.from/size 浅分页查询 一般的分页需求我们可以使用from和size的方式实现,但是这种的分页方式在深分页的场景下应该是避免使用的.深分页的页次增加 ...

  7. 『备忘录』elasticsearch 去重分页查询

    一开始数据结构设计的很复杂,又是父子关系又是嵌套关系,结果发现不能通过简单的查询得到想要的结果:比如一个商店只出现一件符合条件的商品,弄得查询语句就变成这样了 curl -XPOST http://l ...

  8. ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法

    背景:elasticsearch 进行排序的时候,可能会排序数字.日期.但是在排序text类型的时候就会出现上述错误 原因(参考): https://blog.csdn.net/wild46cat/a ...

  9. ElasticSearch - 解决ES的深分页问题 (游标 scroll)

    https://www.jianshu.com/p/f4d322415d29 1.简介 ES为了避免深分页,不允许使用分页(from&size)查询10000条以后的数据,因此如果要查询第10 ...

随机推荐

  1. Linux学习(四)档案与目录管理

    1. 目录与路径  1.1 相对路径与绝对路径  1.2 目录的相关操作: cd, pwd, mkdir, rmdir  1.3 关于执行文件路径的变量: $PATH2. 档案与目录管理  2.1 档 ...

  2. Python的反序列化漏洞

    最近准备研究一下反序列化漏洞,但是Java代码看不懂,所以先找一个python的看起,毕竟这种漏洞在python.php中一样存在,等研究明白了基本原理后去看java的反序列化漏洞. python反序 ...

  3. ORA-28056 解决方法

    用pl/sql devlper 来连接oracle数据库,遇到 0RA-28056错误,解决的方法是 在 计算机-->管理 -->事件查看器里边清理应用程序日志(问题原因是应用程序的日志满 ...

  4. xcode7/ios9中 低版本app运行时,屏幕上下出现黑边的问题

    xcode从低版本升级至 7.0或更高版本后,某些低版本app再次编译运行后,发现app在设备上运行时,会在上端和底部 出现黑边的现象.这导致app的展示界面跟缩水了一样,变得十分丑陋. 对于这一问题 ...

  5. 【 Android】使手机屏幕常亮,不进入待机状态

    Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行. 需要权限 <uses-permission androi ...

  6. Thinkphp --- 入口文件

    通常入口文件是 index.php <?php define('APP_DEBUG',true); //define('BIND_MODULE','Home'); 这句代码会自动生成Home模块 ...

  7. BFS+优先队列+状态压缩DP+TSP

    http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  8. PL/SQL集合(一):记录类型(TYPE 类型名称 IS RECORD)

    记录类型 利用记录类型可以实现复合数据类型的定义: 记录类型允许嵌套: 可以直接利用记录类型更新数据. 传统操作的问题 对于Oracle数据类型,主要使用的是VARCHAR2.NUMBER.DATE等 ...

  9. Linux服务器报错too many open files错误解决方案

    1.本质解决方案按照oracle的安装脚本中以下几项文件进行相应配置: cp /etc/security/limits.conf /etc/security/limits.conf.bak echo ...

  10. jira-source--plugin

    X11 forward impact on jira plugin system initialization. 而Linux的curl使用的证书库在文件“/etc/pki/tls/certs/ca- ...