Elastic Stack--16--ES三种分页策略
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 方式一:from + size
- 实现原理
- 使用方式
- 优缺点
- 方式二:scroll
- 实现原理
- 使用方式
- 优缺点
- 方式三:search_after
- 实现原理
- 使用方式
- 优缺点
- 三种方式总结

方式一:from + size
- from + size是Elasticsearch中最直观的分页方式。其中,from参数表示从第几条记录开始返回,size参数表示返回的记录数。
实现原理

使用方式
- 在Elasticsearch中,使用from和size进行分页查询的DSL(Domain Specific Language):
GET /your_index/_search
{"query": {"match_all": {} // 这里可以替换为任何你需要的查询条件},"from": 0, // 从第几条记录开始,索引从0开始"size": 10, // 返回的记录条数"sort": [{ "field_name": {"order": "asc"}} // 可选,根据某个字段进行排序]
}
from参数指定了从哪一条记录开始返回,size参数指定了要返回的记录条数。
假设一个名为products的索引,搜索名称中包含"apple"的产品,并且从第10条记录开始返回10条结果,按价格升序排序:
GET /products/_search
{"query": {"match": {"name": "apple"}},"from": 9, // 注意,索引从0开始,所以第10条记录的索引是9"size": 10,"sort": [{ "price": {"order": "asc"}}]
}
from设置为9以跳过前9条记录,size设置为10以返回接下来的10条记录,并且结果按照price字段的升序排列。
Elasticsearch会返回如下响应:
{"took": 5,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 100, // 假设总共有100条符合查询条件的产品"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "products","_type": "_doc", // 注意:在Elasticsearch 7.x及之后的版本中,_type字段通常被设置为"_doc""_id": "10","_score": 1.0,"_source": {"name": "Apple iPhone 12","price": 999.99,// ... 其他字段}},// ... 其他9条产品的结果{"_index": "products","_type": "_doc","_id": "19","_score": 1.0,"_source": {"name": "Apple Watch Series 6","price": 399.99,// ... 其他字段}}]}
}
优缺点


使用场景
- 适用于数据量不大、实时性要求高的场景。
方式二:scroll
- scroll是一种基于游标的分页方式,它允许我们遍历大量数据而不需要在每次请求时重新计算整个搜索。
实现原理

使用方式
在Elasticsearch中,scroll是一种用于检索大量数据(可能是数百万条记录)的分页机制,它允许你保持一个搜索的“上下文”并继续检索结果,而不需要为每一页都重新计算整个搜索。以下是使用scroll进行分页的DSL代码示例:
DSL 代码示例
// 初始化scroll搜索
POST /_search/scroll
{"size": 100, // 每次返回的文档数量"scroll": "1m", // 保持scroll上下文的活动时间,这里是1分钟"query": {"match_all": {} // 可替换为任何需要的查询条件}
}// 后续的scroll请求(在第一次请求返回后)
POST /_search/scroll
{"scroll": "1m", // 保持与第一次请求相同的scroll上下文时间"scroll_id": "你的scroll_id" // 第一次请求返回的scroll_id
}

响应结果
第一次请求会返回如下结果:
{"_scroll_id": "DnF1ZXJ5THV6QXRlbl84791547351","took": 1,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": {"value": 1000,"relation": "eq"},"max_score": 1.0,"hits": [{"_index": "your_index","_type": "_doc","_id": "1","_score": 1.0,"_source": {// ... 文档的源数据 ...}},// ... 其他文档 ...]}
}

- 响应中可以看到_scroll_id字段,这个值需要用于后续的scroll请求。
后续的scroll请求
使用上面响应中的_scroll_id进行后续的scroll请求:
POST /_search/scroll
{"scroll": "1m","scroll_id": "DnF1ZXJ5THV6QXRlbl84791547351"
}
- 这个请求会返回下一批文档,直到所有的文档都被检索完或者scroll上下文过期。
- 根据你的Elasticsearch集群的实际设置和性能需求来调整size和scroll参数的值。
优缺点

方式三:search_after
- search_after是一种基于排序值的分页方式,它允许我们根据上一页的最后一条数据的排序值来获取下一页的数据。
实现原理

使用方式

GET /products/_search
{"size": 10,"query": {"match_all": {} // 或者你可以添加具体的查询条件},"sort": [{ "price": {"order": "desc"}},{ "created_at": {"order": "asc"}}]
}

{"_index": "products","_type": "_doc","_id": "最后一个产品的ID","_score": null,"_sort": [129.99, // 最后一个产品的price值"2023-10-23T12:00:00Z" // 最后一个产品的created_at值],"_source": {// ... 产品的详细信息 ...}
}

GET /products/_search
{"size": 10,"query": {"match_all": {} // 保持与初始查询相同的查询条件},"sort": [{ "price": {"order": "desc"}},{ "created_at": {"order": "asc"}} // 保持与初始查询相同的排序字段和顺序],"search_after": [129.99, // 上一页最后一个产品的price值"2023-10-23T12:00:00Z" // 上一页最后一个产品的created_at值]
}

优缺点

三种方式总结





相关文章:
Elastic Stack--16--ES三种分页策略
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 方式一:from size实现原理使用方式优缺点 方式二:scroll实现原理使用方式优缺点 方式三:search_after实现原理使用方式优缺点 三…...
[LeetCode] 315. 计算右侧小于当前元素的个数
题目描述: 给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 题目链接: . - 力扣(LeetCode) 题目主要思路&a…...
【hot100-java】二叉树展开为链表
二叉树篇。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …...
如何在在 YOLOv3模型中添加Attention机制
在YOLOv3模型中添加Attention机制需要以下几个步骤: 1. 规定格式 当添加新的模块(如Attention机制模块)时,需要像定义[convolutional]、[maxpool]等层在cfg文件中的格式一样,对新模块进行格式规定。例如对于SE模块&a…...
单点登录Apereo CAS 7.1安装配置教程
笔者目前正在做一个单点登录的课题,历时较长总算摸到一些门路,其中的辛酸不易按下不表。截至本文发布,CAS的最新版本为7.1。由于涉及到课题内容,而且内容比较新,整理试验不容易,暂时只对VIP开放,后续课题完成后会完全开放,敬请谅解。 CAS项目区别 在CAS的项目选择上,…...
windows C++-移除界面工作线程(一)
本文档演示了如何使用并发运行时将 Microsoft 基础类 (MFC) 应用程序中由用户界面 (UI) 线程执行的工作移动到工作线程。 本文档还演示了如何提高冗长绘制操作的性能。 通过将阻塞性操作(例如,绘制)卸载到工作线程来从 UI 线程中移除工作&am…...
Qt小bug — LINK : fatal error LNK1158: 无法运行“rc.exe“
Qt小bug —— LINK :fatal error LNK1158:无法运行"rc.exe" 环境 Qt 5.14.2 MSVC 2015 x64 现象 解决 在电脑上找到rc.exe 和rcdll.dll (一般在C:\Program Files(x86)\Windows Kits*\bin\x64下面)拷贝到 C:\Qt\Qt5…...
c++小游戏
目录 狼人杀 走迷宫 炸弹人 贪吃蛇 飞翔的小鸟 跑酷 吃豆人 飞机大战 人生模拟器 坦克大战 修仙模拟器 搜集了一些小游戏,名字下是个人是个人喜欢度,可供参考~ 狼人杀 ❤❤❤❤ #include<bits/stdc.h> #include<cstdio> #incl…...
k8s为什么用Calico
Calico是一种开源的网络和安全解决方案,主要用于容器、虚拟机、宿主机之间的网络连接。 它支持Kubernetes、OpenShift、Docker EE、OpenStack等PaaS或IaaS平台,提供高效的网络通信和安全控制功能12。 Calico的核心组件包括Felix、etcd、BIRD等。F…...
HashMap 和 Hashtable 有什么区别?
HashMap和Hashtable都是Java中常用的存储键值对的集合类,它们都实现了Map接口,但二者之间存在一些显著的区别。以下是对HashMap和Hashtable区别的详细归纳: 一、线程安全性 HashMap:是非线程安全的,即多个线程可以同…...
【机器学习】深度学习、强化学习和深度强化学习?
深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标,虽然都属于机器学习的范畴,但各自的实现方式和侧重点有所不同。 1. 深度学习(Deep Learning) 深度学习是一种基于神经网络的…...
fastadmin 多商户模式下侧边栏跳转路径BUG
记录:仅作自己项目记录,在一个域名下部署多套项目时,若不是多商户模式项目会出现跳转路径问题。 修改 \manystore\library\Auth.php 文件的 getSidebar 方法 // 1 改为: $v[url] isset($v[url]) && $v[url] ? $v[url]…...
java内置的四种函数式接口
供给型:Supplier 无入参,有返回值。 FunctionalInterface public interface Supplier<T> {T get();}消费型:Consumer 有入参,无返回值。 FunctionalInterface public interface Consumer<T> {void accept(T t);de…...
如何获取 uni-app 应用发布所需的证书、私钥与配置文件
引言 在开发和发布iOS应用时,开发者常常会面临一系列复杂的证书、私钥密码以及配置文件的管理问题。这些配置不仅影响到应用的开发调试,还决定了应用是否能够顺利通过审核并发布到App Store。对于使用uni-app进行开发的开发者来说,自动生成的…...
TCP网络通信——多线程
前面分别用多进程和多路复用完成了TCP网络通信,本文就来讲讲多线程的TCP通信。首先来了解一下线程的概念: 1、线程是进程的执行路线,它是进程内部的控制序列,或者说线程是进程的一部分(进程是一个资源单位,线程是执行单…...
【exp报错注入】
整数范围 最大整数 exp 函数介绍 报错盲注注入 payload分析 709C-ASCII 值就等于我们下面的 7091-1 ,C就是我们要猜的值,当我们猜测的值和ASCII码相等时,那么exp就不会出现报错,因为1-1还是等于709: 练习 id1 an…...
基于SpringBoot问卷调查系统小程序【附源码】
基于SpringBoot问卷调查系统小程序 效果如下: 管理员登录界面 管理员功能界面 调查人管理界面 问卷调查管理界面 问卷题目管理界面 用户登录界面 APP首页界面 公告信息界面 研究背景 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨&…...
LLM - 配置 GraphRAG + Ollama 服务 构建 中文知识图谱
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142795151 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 GraphR…...
简单认识redis - 6 redis 存储速度快的原因
1基于内存存储 缓存(内存)读写速度很快,相比于磁盘存储的Mysql 省去了磁盘I/O的次数。 2.高效的数据结构 SDS动态字符串: 1.字符串长度处理:Redis获取字符串长度,时间复杂度为O(1),而C语言中&am…...
【Qt Quick】状态:State 使用
State 是 Qt Quick 中管理界面组件状态的关键工具。它允许我们定义组件的不同状态,并且在用户交互或事件发生时进行状态切换,从而实现属性、外观和行为的动态变化。通过使用 State,可以避免复杂的条件逻辑,使代码更加简洁和可维护…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
