ElasticSearch分页查询几种方式分析

1 from+size

  1. 语句示例

    # from+size浅分页
    GET test/_search
    {"from": 10,"size": 2
    }
    
  2. 简要查询过程

    1. 在发送查询请求之后,某个节点node接收请求后,会创建一个大小为from+size的优先队列来保存结果;然后会把请求发送给相关的分片shard,在每个分片shard里面也会做同样的事情,执行查询,并将结果保存到大小为from+size大小的队列里面;最后每个分片会把结果返回到节点node中。
    2. node最终会拿到(from+size)*分片数条数据,这样来看数据量会根据查询的偏移量增加而增加,然后会将这些数据排序后,选出靠前的from+size条数据存到优先队列中
    3. 最后会根据查询条件获取(from,from+size]数据即可
  3. 深度分页问题

    1. 问题

    2. 当from+size的数值大于10000之后,就无法使用from+size方式去查询了。

    3. 原因

      1. 默认情况下,ES对索引的配置项中设置的max_result_window最大值为10000,分页不能超过1W条数据以上
      2. 受限于from+size的查询逻辑,当查询数据的偏移量越大时,整体的查询耗时会几何倍数增加,性能问题会越来越明显
    4. 解决办法

      1. 使用from+size这种方式的分页应用到对于深度分页容忍度较高的应用场景
      2. 调整索引的max_result_window参数,可以根据适当情况调大这个参数。但是不是很推荐,设定这个参数的原因是源于保护的原因,设置一个比较合理的临界值不会导致内存溢出,如果只是一昧的扩大参数值,有可能就会导致很严重的后果,所以在调整这个值的时候最好要考虑各方面因素再决定,如并发、数据量、内存、es本身设置等等。
      3. 采用其他的分页方式,如下面的scroll和search after
  4. 优缺点

    1. 写起来简单,性能低,会存在深度分页问题,适合数据量较小的情况且能容忍深度分页问题

2 scroll

  1. 语句示例

    (暂时把第一条语句称为初始化操作,第二条为检索操作)

    1. 获取scroll_id并获取第一页数据

      GET test/_search?scroll=1m
      {"size": 2
      }
      

    2. 检索

      GET _search/scroll
      {"scroll": "1m","scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEZJQ2xKb0FCcXY3U2dtcVFud0p0AAAAAAAAFrMWNjY3dlA3RGNTcjZNRE52dmFxRDR5QQ=="
      }
      

  2. 简要查询过程

    1. 初始化操作时,需要增加scroll参数,这个参数的值表示本次请求的有效期限,这里是1m=1分钟,返回的结果中包括一个scroll_id这个返回参数值就是用来向下检索的
    2. 后续检索操作都可以直接使用初始化操作获取到的scroll_id,scroll参数表示ES将保留搜索的有效期延长多久,查询到的结果条数也和第一次查询的一致(上述示例中,第一次查询指定了size=2,那么进行后续翻页操作得到的结果都是2条数据)
    3. 可以把scroll的逻辑分成两步操作:需要有一次初始化,以及后续的数据检索
      1. 在初始化操作的时候,ES会把此刻的符合条件的数据保存起来,形成快照,然后返回存在有效期的scroll_id,在后续遍历的之后一直使用这个参数就可以遍历完所有数据
      2. 每次执行初始化操作都会返回不同的含有有效期的scroll_id
  3. 优缺点

    1. 能解决深度分页问题,适合处理大量数据,不适合实时数据需求的业务场景。
    2. 由于scroll_id存在有效期,可能会占用大量资源,而且生成scroll_id时是缓存的当时的符合条件的数据,在那之后的数据变更,都不会在此scroll_id的查询结果中得到同步。

3 search_after

  1. 语句示例

    1. 首次查询

      GET test/_search
      {"size": 2,"sort": [{"fid": {"order": "desc"}}]
      }
      

    2. 第二次查询

      GET test/_search
      {"size": 2,"sort": [{"fid": {"order": "desc"}}],"search_after": [19999]
      }
      

  2. 简要查询过程

    1. search_after的原理是根据上一页的最后一条数据来确定下一页的起始位置的
    2. 在第一次查询的时候,不需要指定search_after的值,但是需要指定排序sort,排序可以指定多个字段,但是可以直接采用每条数据的唯一值字段(可以用_id),在执行查询之后,获取到返回结果最后一条数据的sort值
    3. 第二次查询时就直接使用第一次获取的sort值作为search_after的值即可,后续以此类推,就可以遍历全部数据
  3. 优缺点

    1. 效率高,不存在深度分页问题,可以反应数据实时变化;需要有全局唯一的标识类定位一条数据(可以是一个字段,也可以是多个字段排序组合)
    2. 无状态查询,实时的数据改变会影响查询结果。
      er的值即可,后续以此类推,就可以遍历全部数据
  4. 优缺点

    1. 效率高,不存在深度分页问题,可以反应数据实时变化;需要有全局唯一的标识类定位一条数据(可以是一个字段,也可以是多个字段排序组合)
    2. 无状态查询,实时的数据改变会影响查询结果。

ElasticSearch分页查询几种方式分析相关推荐

  1. ElasticSearch分页查询四种解决方案与原理

    当你拼命想完成一件事的时候,你就不再是别人的对手,或者说得更确切一些,别人就不再是你的对手了,不管是谁,只要下了这个决心,他就会立刻觉得增添了无穷的力量,而他的视野也随之开阔了.--<基督山伯爵 ...

  2. Elasticsearch 分页查询聚合分析

    分页查询 关于 Elasticsearch 分页查询,这几个问题经常被问到 问题1:想请问下,一次性获取索引上的某个字段的所有值(100 万左右),除了把 max_result_window 调大 , ...

  3. sqlserver实现分页的几种方式

    sqlserver实现分页的几种方式 第一种:使用org.springframework.data.domain.Page来进行分页 package com.cellstrain.icell.repo ...

  4. mysql分页总页数算法解析_详解MySQL的limit用法和分页查询语句的性能分析

    limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT ...

  5. mybatis一对多关联查询两种方式

    mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...

  6. elasticsearch 分页查询实现方案——Top K+归并排序

    elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 注意:size的大小不能 ...

  7. vue实现input输入模糊查询(三种方式)

    vue实现input输入模糊查询(三种方式) 目录 vue实现input输入模糊查询(三种方式) 1 计算属性实现模糊查询 演示: 2 watch 监听实现模糊查询 3 通过按钮点击实现模糊查询 演示 ...

  8. vue实现分页的两种方式

    vue实现分页的两种方式 (1)方法一:使用slice方法 一次调用后端接口返回所有数据tableData,然后使用tableData.slice((currentPage-1)*pageSize,c ...

  9. Wps 2013 拼音标注两种方式分析

    Wps 2013 拼音标注两种方式分析 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...

最新文章

  1. 【Android】4.3 屏幕布局和旋转
  2. JSP数据交互(一)
  3. 微信小程序开发与应用 第一章 微信小程序的基本知识1
  4. 不等号属于不等式吗_初中数学:关于解不等式应用题的难点突破策略,用了就能拿高分...
  5. TensorFlow 教程 --进阶指南--3.5线程和队列
  6. jfinal使用配置文件注意事情
  7. 2100 没有反弹shell_反弹shell | ncbash
  8. 地市级公安局实战通信指挥调度方案
  9. 使用python将豆瓣妹子的图片批量搬运到百度网盘
  10. 嗅探工具 --- wireshark、tcpdump、dsniff、ettercap、bettercap、netsniff-ng
  11. python爬取京东商品图片_Python---爬取京东商城的图片
  12. 玩转字符串篇--代码自动生成,解放双手,android音视频开发
  13. Spring 事务源码(2)—<tx:annotation-driven/>事务标签源码解析
  14. 云服务器能像虚拟主机那样,云服务器能像虚拟主机那样
  15. 【转】 教你一眼认出英语单词的意思
  16. PC客户端抓包方法(charles+proxifier)
  17. MPB:山大倪金凤组-培菌白蚁肠道簇虫分离与分子鉴定的方法
  18. js 给爱的人发个邮件吧
  19. 20170215找女朋友之路思考总结
  20. vga转html电脑打不开,HDMI转VGA常见故障及排除方法?

热门文章

  1. 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf
  2. 2022-2028全球活性炭再活化服务行业调研及趋势分析报告
  3. 34. 池化层 / 汇聚层
  4. 创客教育在中小学的实施策略
  5. 【ROM定制】Android 12 制作『MIUI官改』那点事⑤去除
  6. 【附源码】Java计算机毕业设计健身房管理系统(程序+LW+部署)
  7. idea_基于web药店药品管理系统设计
  8. 使用JS将数字金额转为大写的人民币
  9. 计算机检索高级教程,SCI检索高级教程
  10. 构建网络广告投放平台(二)