ElasticSearch之通过search after和scroll解决深度分页问题

news2025/1/19 10:03:17

写在前面

通过from,size来进行分页查询时,如下:
在这里插入图片描述
当from比较大时会有深度分页问题,问题产生的核心是coordinate node需要从每个分片中获取from+size条数据,当from比较大,整体需要获取的数据量也会比较大,如下图:
在这里插入图片描述
所以es深度分页问题的核心就在于每个分片多需要返回from+size条数据,所以,如果能解决这个问题,也就解决深度分页的问题了。

但es针对from size方式的深度分页问题也是提供了一定的应对措施的,比如通过参数index.max_result_window,默认是10000条,如下超过1万条时将会报错:

  • 1
    在这里插入图片描述
  • 2
    在这里插入图片描述

并且,为了更好的解决深度分页问题,es同时提供了search after和scroll两种方式来解决深度分页,其中前者是通过定位到某个数据的方式来解决,后者是通过创建快照的方式来解决。

分别看下。

1:search after

search after是实时分页,并且要求sort的字段必须是唯一的(多个sort字段组合在一起唯一也可),所以一般我们在使用search after时,会在不影响业务要求的排序基础上将_id也加上去,如下:

  • 格式
{
    "size": "size值",
    "query": {
        具体的chaxun
    },
    "search_after": [上一个sort 的结果]",
    ”sort“: [sort数组]
}
  • 实例
    在这里插入图片描述

为了测试,我们先来准备测试数据:

DELETE users

POST users/_doc
{"name":"user1","age":10}

POST users/_doc
{"name":"user2","age":11}

POST users/_doc
{"name":"user3","age":12}

POST users/_doc
{"name":"user4","age":13}

// "count" : 4,
GET users/_count
  • 查询第一页的数据

此时需要使用from size来查询

POST users/_search
{
    "from": 0,
    "size": 1,
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "age": "desc"
        },
        {
            "_id": "asc"
        }
    ]
}

取结果中的sort值作为查询下一页数据的入参:
在这里插入图片描述

  • 查询下一页
POST users/_search
{
    "size": 1,
    "query": {
        "match_all": {}
    },
    "search_after":  [
          13,
          "z-cxE44BbPrZSKsI0wh6"
        ],
    "sort": [
        {
            "age": "desc"
        },
        {
            "_id": "asc"
        }
    ]
}

如此重复直到没有下一页:
在这里插入图片描述

search after通过每次从每个分片获取from+size的数据量变为size来解决了深度分页的问题,如下图:
在这里插入图片描述

2:scroll api

scroll api通过快照的方式来解决深度分页问题,即第一次查询时会生成一个全量数据的快照,因此快照生成后的数据将无法被查询,这种方式一般用于数据导出等场景中。
在这里插入图片描述

看例子。

  • 准备数据
DELETE users

POST users/_doc
{"name":"user1","age":10}

POST users/_doc
{"name":"user2","age":11}

POST users/_doc
{"name":"user3","age":12}

POST users/_doc
{"name":"user4","age":13}
  • 创建scroll快照,五分钟失效
POST users/_search?scroll=5m
{
  "size": 1,
  "query": {
    "match_all": {}
  }
}

在这里插入图片描述

  • 查询下一页
POST /_search/scroll
{
  "scroll": "1m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAhesWUk9pVDk4SUdSUXEyRGlhc21kVDJUZw=="
}

一直查询到没有下一页:
在这里插入图片描述
再来插入一条:

POST users/_doc
{"name":"user5","age":14}

因为读的是快照,所以是查不到的。

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java_JSON】如何从JSON数据中提取value值

如何从JSON数据中提取value值? 首先将JSON数据转成字符串 创建JSONObject 对象 通过kv键值对的特性 使用key值来获取value 值 并输出 结果:

Redis(十七)分布式锁

文章目录 面试题分布式锁锁的种类分布式锁需要具备的条件和刚需分布式锁 案例nginx分布式微服务部署,单机锁问题分布式锁注意事项lock/unlocklua脚本自研版的redis分布式锁搞定lua脚本 可重入锁可重入锁种类可重入锁hset实现,对比setnx(重要&…

Jmeter压测分配业务比例

在进行综合场景压测时,由于不同的请求,要求所占比例不同,如何实现呢? 不同的请求,服务器对其处理能力不同,有的处理快,有的处理慢。 真实模拟按比例进行并发: 在使用LR进行过类似…

在winform中如何嵌入第三方软件窗体✨

相关win32api的学习✨ SetParent [DllImport("user32.dll ", EntryPoint "SetParent")] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //将外部窗体嵌入程序语法: HWND SetParent([in] H…

windows关闭copilot预览版

如果用户不想在windows系统当中启用Copilot,可以通过以下三种方式禁用。 第一种:隐藏Copilot 按钮 右键点击任务栏,取消勾选“显示 Copilot(预览版)按钮”,任务栏则不再显示,用户可以通过快捷键…

2024 年 AI 辅助研发趋势:从研发数字化到 AI + 开发工具 2.0,不止于 Copilot

在上一年里,已经有不少的企业在工具链上落地了生成式 AI,结合我们对于这些企业的分析,以及最近在国内的一些 “新技术” 趋势,诸如于鸿蒙原生应用的初步兴起。从这些案例与趋势中,我们也看到了一些新的可能方向。 结合…

【C++】蓝桥杯必备 算法竞赛常用STL万字总结

传送门⏬⏬⏬[方便查表] 🌟一、什么是STL?🌟二、为什么STL重要?✨1、原因✨2、STL的作用 🌟三、STL知识点总结✨0.使用说明书✨1、vector 【可变数组】✨2、pair [ x,y ]✨3、string【字符串】✨4、queue【队列】 和pr…

2024年【道路运输企业安全生产管理人员】复审考试及道路运输企业安全生产管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年道路运输企业安全生产管理人员复审考试为正在备考道路运输企业安全生产管理人员操作证的学员准备的理论考试专题,每个月更新的道路运输企业安全生产管理人员模拟考试题祝您顺利通过道路运输企业安全…

第三讲 汇编初步 课程随手记

一、寄存器 32位CPU通用寄存器如下图所示: 因为教材依照的是32位CPU寄存器,而我安装的是64位寄存器,所以找了一下64位的寄存器的资料 PS:一般来说,Intel处理器字节存储顺序为小端法存储,是指数据的高字节保…

JavaScript极速入门(1)

初识JavaScript JavaScript是什么 JavaScript(简称JS),是一个脚本语言,解释型或者即时编译型语言.虽然它是作为开发Web页面的脚本语言而著名,但是也应用到了很多非浏览器的环境中. 看似这门语言叫JavaScript,其实在最初发明之初,这门语言的名字其实是在蹭Java的热度,实际上和…

Vue2+ElementUI下拉、Select组件的封装

Vue2ElementUI下拉、Select组件的封装:引言 在 Vue2 项目中,ElementUI 的 el-select 组件是常用的下拉选择框组件。它提供了丰富的功能和样式,可以满足各种需求。但是,在实际开发中,我们经常会遇到一些重复性的需求&a…

男人的玩具系统wordpress外贸网站主题模板

垂钓用品wordpress外贸模板 鱼饵、鱼竿、支架、钓箱、渔线轮、鱼竿等垂钓用品wordpress外贸模板。 https://www.jianzhanpress.com/?p3973 身体清洁wordpress外贸网站模板 浴盐、防蚊液、足部护理、沐浴液、洗手液、泡澡用品wordpress外贸网站模板。 https://www.jianzhan…

【CSP试题回顾】201612-1-中间数

CSP-201612-1-中间数 解题思路 输入和初始化:首先,程序读入一个整数n,表示序列中数的个数。接着,读入n个正整数并存储在numList向量中,这些数依次表示a1, a2, …, an。 排序:使用sort函数对numList进行升…

前端运算符比较与计算中的类型转换,运算规则

题目: 下面表达式的值分别都是什么(类型转换) 0 0 0 2 true 2 false false false false 0 false undefined false null null undefined\t\r\n 0JS中的原始类型有哪些 原始值类型就是 存储的都是值,没有函数可以调用的。…

【Python时序预测系列】基于LSTM+Attention实现单变量时间序列预测(源码)

这是我的第232篇原创文章。 一、引言 长短期记忆网络(LSTM)结合注意力机制是一种常用的深度学习模型结构,用于处理序列数据。LSTM是一种循环神经网络(RNN)的变体,专门设计用来解决长序列数据的梯度消失和…

不知道去哪里找拍抖音的短视频素材?分享几个抖音短视频素材资源网站

嘿嘿,小伙伴们,是不是在抖音创作的路上遇到了素材荒?别担心,我这里有几个超给力的短视频素材网站推荐给大家,保证让你的创作不再为素材发愁 1,蛙学府资源 这个网站简直是短视频素材的大宝库,无…

CSS盒子模型笔记

尚硅谷学习视频链接:117_CSS_盒子模型的组成部分_哔哩哔哩_bilibili 1、盒子组成 盒子组成 content内容 padding border (margin不包含在盒子内) 2、div样式width、height 当css3属性box-sizingcontent-box(默认&#xff0…

基于Java的超市自助付款系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示六、…

乐优商城(八)商品详情

1. 搭建商品详情微服务 当用户搜索到商品后,如果想要了解商品的更多信息,就需要进入商品详情页。 由于商品详情浏览量比较大,所以我们会创建一个微服务,用来展示商品详情。我们的商品详情页会采用 Thymeleaf 模板引擎渲染后&…

Linux高级编程:网络

回顾: 进程间的通信: 同一主机内通信: 传统的进程间通信方式(管道、信号); IPC对象(共享内存,消息队列,信号量集); 不同主机间进程的通信&#…