ES 翻页优化

ES翻页

ES 翻页,有下面几种方案

  1. from + size 翻页
  2. scrool 翻页
  3. scrool scan 翻页
  4. search after 翻页

from + size 翻页

POST /xxx_index/_search
{"query": { "match_all": {}},"from": 100,"size":  10
}

使用 from + size 可进行翻页

  • from 参数定义了需要跳过的 hits 数,默认 0
  • size 参数定义了需要返回的 hits 数目的最大值

ES 默认的单页查询最大限制(max_result_window)为10000。

该方案在翻页数目较多(即 from 较大)或者 size 特别大的情况,会出深翻页问题(deep pagination)。

该方案的优点

  1. 实现较为简单
  2. 可以指定任意合理的页码,实现跳页查询

该方案的缺点

  1. 深翻页时,耗时较长

scrool翻页

scrool翻页方案,主要用于「一次性查询大量的数据(甚至是全部数据)」,适合「非实时处理大量数据」的场景,该方案并不适合用来做「实时数据查询」。

  1. 第一次查询时,会生成一个 scrollId,并将所有符合搜索条件的搜索结果缓存起来。注意,这里只是缓存的 doc_id,并不是真的缓存了所有的文档数据,取数据是在 fetch 阶段完成的。

from+ size 翻页方案中,我们可以指定任意合理的页码,实现跳页查询;但在 scroll 方案中,无法实现跳页面查询,因为该方案中除了第一次查询,其余的查询都需要上一次查询返回的 scrollId

该方案的优点

  1. 性能较好,适合一次性查询大量的数据

该方案的缺点

  1. 使用了 scrollId,会占用大量的资源(特别是排序的请求)
  2. 生成的 scrollId 是基于历史数据的快照,若此时数据发生了变化,则不会反映在快照上,所以不适合用作「实时数据查询」

scroll scan 翻页

scroll scan 方式在单纯 scroll 方式的基础上,进一步提升了性能,适合「非实时处理大量数据」的场景。

单纯的使用 scroll 方式查询,可支持排序。若使用 scroll + scan 的方式,则不支持排序。

search after 翻页

search after 是 ES 5 引入的一种分页查询机制,其原理和 scroll 类似。

  • 请求时,会返回一个包含 sort 排序值的数组
  • 在下一次请求时,可以将包含 sort 排序值的数组用于请求入参,以便抓取下一页的数据

该方案的优点

  1. 不需要维护 scrollId,不需要维护快照,因此可以避免消耗大量的资源

该方案的缺点

  1. 至少需要指定一个唯一的不重复字段来排序
  2. 不适用于大幅度跳页查询,或者全量导出

翻页方案对比

翻页方式 性能 优点 缺点 场景
from + size 灵活性好,简单实现 深度分页问题 数据量比较小,
能容忍深度分页问题
scroll 解决了深度分页问题 需要维护一个 scrollID (快照版本),
无法反应数据的实时性;可排序,但无法跳页查询
查询海量数据
scroll scan 基于 scroll 方案,进一步
提升了海量数据查询性能
无法排序,其余缺点同 查询海量数据
search after 性能最好,不存在深度分页的问题,
能够反映数据的实时变更
实现复杂,需要有一个全局唯一的字段。
连续分页的实现会比较复杂,因为每一次
查询都需要上次查询的结果。
不适用于大幅度跳页查询,
适用于海量数据分页

elasticsearch翻页优化相关推荐

  1. mysql+翻页性能,mysql 翻页优化

    mysql翻页优化 对于翻页,我们通常是用 select fields from table limit 100,10 但是当要越翻后面的页数之后,耗时变得很长 select fields from ...

  2. elasticsearch翻页与深度翻页,以及获取全部数据

    我们通常会有需求:根据指定条件,查询数据.并分页展示.甚至还有可能要导出全部的数据. 在工作中,经常会有需求,将指定条件的数据导出(这个数据量多数在2亿以上,有一次是18亿).导出数据的速度是挺慢的, ...

  3. 倒序查询_mysql大表分页查询翻页优化方案

    mysql分页查询是先查询出来所有数据,然后跳过offset,取limit条记录,造成了越往后的页数,查询时间越长 一般优化思路是转换offset,让offset尽可能的小,最好能每次查询都是第一页, ...

  4. MySQL中的翻页优化和延迟缓存

    limit offset,N 当offset非常大时,效率极低.  原因是:mysql并不是跳过offset行,然后单取N行.而是取offset+N行. 返回时,放弃前offset行,返回N行.效率较 ...

  5. mysql大翻页limt 1700,100慢优化方案

    1.引言 公司有个需求,统计短信系统每天status没成功的电话号码,然后进行统计分析.为了省事,我直接用了现成的sql, 该sql是分页,每次筛选limit一百条,最后合并下,最后不就得出所有的手机 ...

  6. UE4 Material 101学习笔记——01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化

    UE4 Material 101学习笔记--01-07 介绍/PBR基础/UV扭曲/数据类型/翻页动画/材质混合/性能优化 Lec 01 什么是着色器 What Is A Shader? 1.1 介绍 ...

  7. 总是搜不到想要的内容?Elasticsearch搜索排名优化了解一下

    导语 | Elasticsearch(下文简称ES) 是当前热门的开源全文搜索引擎,利用它我们可以方便快捷搭建出搜索平台,但通用的配置还需要根据平台内容的具体情况做进一步优化,才能产生令用户满意的搜索 ...

  8. 大数据翻页_【干货】大数据翻页的难点和技巧

    今天要讨论一个传统的问题,问题本身比较简单,就是针对大数据,如何优化方案做到性能与成本的平衡.我们经常会遇到一种Key-list类型数据, 如一个用户的好友关系 {"uid":{1 ...

  9. 安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页

    摘自:安卓APP_ Fragment(4)-- Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页 作者:丶PURSUING 发布时间: 2021-04-20 17:46 ...

最新文章

  1. MySQL 数据库 InnoDB 和 MyISAM 数据引擎的差别
  2. Android mediaRecorder框架简述(二)
  3. IE下iframe跨域session和cookie失效问题的解决方案
  4. Lesson Plan 原文
  5. Grafana v6.0.0 发布,系统指标监控与分析平台
  6. 背包九讲Java版本
  7. java制作主页,JSP教程基础篇之简单首页制作
  8. 基于等离激元的空间微分
  9. 探讨“浩方对战平台”
  10. 直击2018互联网大裁员:繁花落地,一地鸡毛
  11. 函数feof使用注意事项
  12. OSChina 周日乱弹 ——颜值和代码水平是正比
  13. 什么是 Tableau?
  14. 彻底搞懂VGGNet-16
  15. 政考网:一年最多可以参加几次公务员考试?
  16. iphone11系列的尺寸_还有必要吗?iPhone 11系列终于要全家族支持双卡双待了
  17. Python Socket 编程详细介绍
  18. Windows和Ubuntu双系统双引导教程
  19. 中兴通讯智能手机生产链探秘
  20. 公式编辑,图片转公式,公式截图一键转换为word公式或者latex

热门文章

  1. python getattr和getattribute_python中__get__、__getattr__、__getattribute__详解
  2. 用Python爬取手机壁纸,太简单了吧!
  3. 银行发展待遇:总行VS分行
  4. MVVM数据双向绑定
  5. JQData | 利用区间极值法对牛熊市进行简单划分
  6. 邮递骑士服务器维护,服务器为什么是维护状态
  7. ACM 生涯指导 先转过来 心情好再看!干他!
  8. 程序员应该加入的3个QQ群
  9. GO语言的基本语法体结构
  10. Mysql索引知识概括