一 序

本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。

二 分页

2.1 From / Size

  • 默认情况下,查询按照相关度算分排序,返回前 10 条记录
  • 容易理解的分页方案
    • From : 开始位置
    • Size:期望获取文档的总数

这里理解下:我只需要查询size条数据,而es则需要执行from+size条数据然后处理后返回。所以有很大的开销。

2.2 分布式系统中深度分页的问题

ES 天生就是分布式,查询信息,但是数据分别保存在多个分片,多台机器,ES 天生就需要满足排序的需要(按照相关性算分)
当一个查询:From = 990 ,Size =10

  • 会在每个分片上先获取 1000 个文档。然后,通过 Coordinating Node 聚合所有结果。最后在通过排序选取前 1000 个文档
  • 页数越深,占用内容越多。为了避免深度分页带来的内存开销。ES 有个设定,默认限定到 10000 个文档

2.3 demo

超出范围,会报错

3 Search After 避免深度分页的问题

  • 避免深度分页的性能问题,可以实时获取下一页文档信息

    • 不支持指定页数(From)
    • 不能往下翻
  • 第一步搜索需要指定 sort,并且保证值是唯一的(可以通过加入_id 保证唯一性)
  • 然后使用上一次,最后一个文档的 sort 值进行查询

3.1 demo

数据准备:

#Scroll API
DELETE usersPOST users/_doc
{"name":"user1","age":10}POST users/_doc
{"name":"user2","age":11}POST users/_doc
{"name":"user2","age":12}POST users/_doc
{"name":"user2","age":13}

执行查询

针对返回的结果wkD_8HIBYdMHFwfFArwf,放到search_after。这样:

可以看到通过设置search_after的值,是可以避免深度分页的。

3.2Search After 是如何解决深度分页的问题

  • 假设 Size 是 10
  • 当查询 990 -1000
  • 通过唯一排序值定位,将每次要处理的文档都控制在 10(避免性能开销)

看到这里,如果你熟悉MySQL,那么 自然也会想到MySQL的分页也可以采取类似的办法来避免offset导致的分页的尾页慢。

4 Scoll API

  • 创建一个快照,有新的数据写入以后,无法被查找
  • 每次查询后,输入上一次的 Scroll Id

4.1demo

数据准备,重新插入3条数据

我们使用scroll 生成快照,时间是5分钟

再插入一条记录:

吧第一次的scroll id拷出来,这样执行查询,最终只能查出3条记录。

{"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAABjfgWNURvOERhUl9RV2U4U2stczl1RmZFQQ==","took" : 5,"timed_out" : false,"terminated_early" : true,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 1.0,"hits" : [ ]}
}

文档4 是快照产生之后插入的,是无法被查到的。

5 不同的搜索类型和使用场景

Regular

  • 需要实时获取顶部的部分文档。例如查询最新的订单

Scorll

  • 需要全部文档,例如导出全部数据

Pagination

  • From 和 Size
  • 如何需要深度分页,则选用 Search After

***************************

理解很重要。

Elasticsearch核心技术与实战学习笔记 43 | 分页与遍历:From, Size, Search After Scroll API相关推荐

  1. 《Elasticsearch核心技术与实战》笔记

    <Elasticsearch核心技术与实战>笔记 1.Video1: 2.Video2: 3.Video3:简介及发展历史 4.Video4:家族成员 5.Video5:安装下载 逻辑设计 ...

  2. Redis核心技术与实战-学习笔记(二十九):Redis并发控制

    一.需要并发控制的原因 Redis不可避免的会遇到并发访问问题,比如多用户同时下单,就会对缓存在Redis中的商品库存并发更新,一旦有了并发操作,数据就会被修改,如果我们没有对并发写请求做好控制,就可 ...

  3. Redis核心技术与实战-学习笔记(二十六):缓存雪崩、击穿、穿透

    一.缓存雪崩 缓存雪崩:大量应用请求无法在Redis缓存中进行处理,应用请求频繁访问数据库,导致数据库压力激增. 产生原因: 缓存中有大量数据同时过期,导致大量请求无法得到处理 数据保存在缓存中,并设 ...

  4. Redis核心技术与实战-学习笔记(十五):消息队列(Redis的解决方案)

    一.消息队列 消息队列:分布式系统必备的一个基础软件,能支持组件通信消息的快速读写 Redis本身支持数据的快速访问,满足消息队列的读写性能需求 二.Redis适合做消息队列吗? 消息队列的消息存取需 ...

  5. Redis核心技术与实战-学习笔记(五)内存快照RDB

    一.为什么需要RDB AOF 方法优势:每次执行只需要记录操作命令,需要持久化的数据量不大.在进行写后日志只要不采用always(同步写回)的持久化策略就不会对性能造成太大影响. AOF方法劣势:AO ...

  6. Kafka 核心技术与实战学习笔记(二十四)请求处理过程

    一.请求/响应 所有的请求都是通过 TCP 网络以 Socket 的方式进行通讯的. Apache Kafka自定义的请求协议: PRODUCE请求是用于生产消息的 FETCH请求是用于消费消息的 M ...

  7. Redis核心技术与实战-学习笔记(七)哨兵机制

    一.主库挂了,如何不间断服务? 主库挂了,需要运行一个新的主库:将从库切换为主库.这就涉及到三个问题: 主库真的挂了吗? 选择哪个从库作为主库? 如何把新主库相关信息通知给从库和客户端 Redis主从 ...

  8. Redis核心技术与实战-学习笔记(三十五)Redis使用建议

    键值对使用规范 key的命令规范,只有命名规范,才能提供可读性强,可维护性好的key,方便日常管理: value的设计规范,包括避免bigkey,选择高效序列化方法和压缩方法,使用整数对象共享池,数据 ...

  9. Redis核心技术与实战-学习笔记(十四):时间序列数据

    一.时间序列数据 时间序列数据:没有严格的关系模型,记录的信息可以表示成键和值的关系. (例如,一个设备ID对应一条记录): 时间序列数据的读写特点 持续高并发写入,需要连续记录数万个设备的实时状态值 ...

最新文章

  1. FastDFS安装、配置、部署(一)
  2. html任务清单源码,JavaScript jQuery 任务清单 ToDoList
  3. c++ vector clear()清除容器中所有数据
  4. vmware虚拟机不识别usb设备
  5. 基准测试 ApacheBench ab学习
  6. Spring 事务 以及拦截器的前后关系实验 Mybatis 日志拦截
  7. 如何安装pylab:python如何导入matplotlib模块
  8. POJ - 3984
  9. 集合交集,并集,差集运算
  10. 华为发布麒麟 990 芯片;苹果召回部分电源插头转换器;KDevelop 5.4.2 发布​ | 极客头条...
  11. linux apache 配置视频教程,《Linux服务器配置视频教程》ubuntu centos apache iptables 后盾网向军老师主讲[WMV]...
  12. 并发编程学习之ConcurrentHashMap扩容机制
  13. PMP第六版十五至尊图记忆方法
  14. 什么是零点漂移,怎么抑制零点漂移?(硬件每日一题)
  15. 365天英语口语大全
  16. 【GLPNet2021】GLOBAL-LOCAL PROPAGATION NETWORK FOR RGB-D SEMANTIC SEGMENTATION
  17. 《黑客帝国》的宗教启示
  18. 树莓派开发实战项目 智能家居--简单工厂模式(摄像头图片获取)
  19. 推荐这三款亲测好用的ai工具
  20. java输出美国的时间_java显示当前美国洛杉矶时间

热门文章

  1. 人工智能识别图片食物
  2. ZYI官网动态单页html引导页源码
  3. 2023年全国职业技能大赛软件测试之功能测试计划模板
  4. HTML之魂 - HEAD元素
  5. 怎么保存网页html文件,怎么保存网页HTML文件
  6. maven与layUI的权限设计
  7. 程序员加班到深夜,隔天却被老板开除,调出监控后,网友:人渣
  8. 软件测试要素_软件美好未来的要素
  9. xcode江湖录-第04章 风水宝地--界面生成器之StoryBoard简单示例 与 约束
  10. 关于QOSEC病毒的...不知道名字..已经搞掂