elasticsearch 深度分页查询 Search_after(图文教程)

Search_after使用

    • 一. 简介
    • 二. 不带PIT的search_after查询
      • 2.1 构造数据
      • 2.2 search_after分页查询
      • 2.2 问题
    • 三. 带PIT的search_after查询
      • 3.1 构建第一次查询条件
      • 3.2 进行下一页查询
      • 3.3 删除PIT
    • 四.参考文章

前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。
作者:神的孩子都在歌唱

一. 简介

search_after 是 Elasticsearch 提供的一种分页查询方式,它可以用来在已经排序的结果集中进行分页查询。

search_after查询步骤如下(下面有具体的例子帮助理解):

image-20240306154454909

最后一条排序结果相当于它的游标

优点:

  1. 性能优势: 相对于传统的 fromsize 参数来说,search_after 在处理大量数据时性能更好,因为它不需要跳过之前的结果集,不严格受制于 max_result_window,可以无限制往后翻页。 fromsize只能翻页10000条.
  2. 适用于实时数据: 在实时数据更新频繁的场景下,search_after 可以确保查询结果的准确性,因为它不会受到新数据插入的影响。
  3. 避免深度分页问题: 使用 search_after 可以避免深度分页问题,即当页数很大时,传统的分页方式性能会下降。

缺点:

  1. 需要结果排序: 使用 search_after 前需要对结果集进行排序,如果排序字段较多或者数据量较大,可能会影响性能。
  2. 只适用于唯一排序字段: search_after 只支持基于唯一排序字段的分页查询,如果有多个排序字段,需要确保排序字段的唯一性。
  3. 不支持随机访问: 由于 search_after 是基于上一页的最后一个文档进行分页,所以不支持随机访问,只能逐页查询。

使用场景:

  1. 大数据量分页查询: 当需要处理大量数据并进行分页查询时,search_after 可以提供更好的性能。
  2. 实时数据展示: 在实时数据展示的场景下,可以使用 search_after 来确保查询结果的准确性。
  3. 避免深度分页问题: 当需要避免深度分页问题时,可以考虑使用 search_after 来提高查询效率。

官方文档说明不再建议使用scroll滚动分页和from size分页,建议使用search_after

We no longer recommend using the scroll API for deep pagination. If you need to preserve the index state while paging through more than 10,000 hits, use the search_after parameter with a point in time (PIT).

我们不再建议使用滚动 API 进行深度分页。如果需要在分页超过 10,000 个命中时保留索引状态,请使用带有时间点 (PIT) 的 search_after 参数。

By default, you cannot use from and size to page through more than 10,000 hits. This limit is a safeguard set by the index.max_result_window index setting. If you need to page through more than 10,000 hits, use the search_after parameter instead.

默认情况下,您不能使用fromsize翻阅超过 10,000 个点击。该限制是由索引设置设置的保障措施 index.max_result_window。如果您需要翻阅超过 10,000 个点击,请使用search_after 参数代替。

二. 不带PIT的search_after查询

建议带PIT,我举的这个列子是帮助理解PIT的作用

2.1 构造数据

PUT /test/_bulk?refresh
{"index":{}}
{"name": "小狗", "leg": 4, "iswing": false}
{"index":{}}
{"name": "小鸡", "leg": 2, "iswing": true}
{"index":{}}
{"name": "小猫", "leg": 4, "iswing": false}

2.2 search_after分页查询

注意:当我们使用search_after时,from值必须设置为0或者-1。

首先我们通过排序查询10条数据

GET /test/_search
{"size": 10, "sort": [{"name.keyword": {"order": "desc" // 对返回的值进行排序}}]
}

image-20240306104332631

要获取下一页结果,需要使用最后一条文档的排序值(也就是sort列表里面的值) 作为 search_after 参数重新运行上一个搜索。

GET test/_search
{"size": 10, "search_after": ["小鸡"],"sort": [{"name.keyword": {"order": "desc"}}]
}

这样子他就会从排序好的name为小猫开始查询

image-20240306104738671

2.2 问题

  1. 每次检索新的结果页时更新数组,重复此过程。如果这些请求之间发生刷新,结果的顺序可能会发生变化,从而导致页面之间的结果不一致。为了防止这种情况,您可以创建一个时间点 (PIT) 来在搜索中保留当前索引状态。

  2. 排序的值不唯一,翻页的时候文档对应不上。为了防止这种情况,PIT 搜索请求都会添加一个名为 _shard_doc 的隐式排序字段,该字段也可以显式提供,这个字段在es中叫做 tiebreaker 。此字段包含每个文档的唯一值。如果您不包含tiebreaker字段,则分页结果可能会丢失或重复命中。

比如我在插入一只小鸟

PUT /test/_bulk?refresh
{"index":{}}
{"name": "小鸟", "leg": 2, "iswing": true}

在执行查询语句

GET test/_search
{"size": 10, "search_after": ["小鸡"],"sort": [{"name.keyword": {"order": "desc"}}]
}

可以看到查询的结果发生了变化,并且第11条应该还是小鸡而不是小鸟

image-20240306105632872

为了解决这种情况,es在7.x引入了PIT的概念,它相当于是 存储索引数据状态的轻量级视图。

三. 带PIT的search_after查询

一些关于PIT的知识:

PIT的快照时间点: 创建 PIT 时记录的是索引状态的快照,而不是实时数据。即使 PIT 不过期,它也只反映创建 PIT 时的索引状态,而不包括之后新增的数据。

数据更新延迟: 即使使用 PIT 进行查询,由于数据写入和索引过程中可能存在一定的延迟,新数据可能不会立即反映在查询结果中。这种延迟可能导致查询结果不是实时的。

实时性需求: 如果需要实时性较高的查询结果,可能需要结合其他机制或策略来确保数据的实时性,如定时刷新 PIT、定时重新创建 PIT 等。

PIT对于翻页的作用:PIT确保了在后续翻页的过程中,可能会有新数据写入等操作,但这些操作不会对原有结果集构成影响,保障数据的一致性。

关于 pit的官方文档

3.1 构建第一次查询条件

POST /test/_pit?keep_alive=1m

keep_alive必须要加上,它表示这个pit能存在多久,这里设置的是1分钟

image-20240306140218461

构建第一次查询条件

GET /_search
{"size": 10,"pit": {"id": "z9_qAwELdGVzdC0wMDAwMDQWVGxjUUVIUzhRQktTTkJRU3VQQXlodwAWWGlMYTRUQ2VUaE9PVlJHNzRTdHBVdwAAAAAAAAauuRZ3bEkwVkx1MlR6YVlsMUZ4MHpUV05nAAEWVGxjUUVIUzhRQktTTkJRU3VQQXlodwAA","keep_alive":"1m"},"sort": [{"name.keyword": {"order": "desc"}}]
}

输出值如下

image-20240306135240804

我上面展示的是最后一条文档,可以看到排序sort中莫名多了个28 ,这在es官方文档中叫做tiebreaker ,官方文档中解释如下

如果您使用 PIT,tiebreaker 是 隐含的排序值,是基于_shard_doc 的升序排序方式。 _shard_doc 值是 PIT 中的分片索引和 Lucene 的内部文档 ID 的组合,它对于每个文档都是唯一的 。您还可以在搜索请求中手动添加 tiebreaker 以自定义顺序:

网上解释:tiebreaker (决胜字段),tiebreaker 等价于_shard_doc。tiebreaker 本质是每个文档的唯一值,确保分页不会丢失或者分页结果数据出现重复(相同页重复或跨页重复)。

可以在sort里面加上_shard_doc 进行自定义排序

"sort": [
{"name.keyword": {"order": "desc"},"_shard_doc": "asc"
}

3.2 进行下一页查询

我们在拿它sort里面的值放入到search_after中进行下一页查询

在每个搜索请求中添加 keep_alive 参数来延长 PIT 的保留期,相当于是重置了一下时间

GET /_search
{"size": 10,"pit": {"id": "z9_qAwELdGVzdC0wMDAwMDQWVGxjUUVIUzhRQktTTkJRU3VQQXlodwAWWGlMYTRUQ2VUaE9PVlJHNzRTdHBVdwAAAAAAAAauuRZ3bEkwVkx1MlR6YVlsMUZ4MHpUV05nAAEWVGxjUUVIUzhRQktTTkJRU3VQQXlodwAA","keep_alive":"1m"},"sort": [{"name.keyword": {"order": "desc"}}],"search_after": ["小鸡",28],"track_total_hits": false     // 禁用总点击率跟踪以加快分页速度     
}

通过以下输出可以看到。我们已经成功进入到下一页了

image-20240306135630489

这样子就能够成功进行分页查询了

3.3 删除PIT

完成后,您应该删除您的 PIT。

DELETE /_pit
{"id" : "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}

四.参考文章

https://blog.csdn.net/qq_26857259/article/details/134372438

https://blog.csdn.net/yangbindxj/article/details/123979413 有上一页方案

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

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

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

相关文章

傅里叶变换pytorch使用

参考视频:1 傅里叶变换原理_哔哩哔哩_bilibili 傅里叶变换是干嘛的: 傅里叶得到低频、高频信息,针对低频、高频处理能够实现不同的目的。 傅里叶过程是可逆的,图像经过傅里叶变换、逆傅里叶变换后,能够恢复到原始图像…

【管理干部竞聘上岗】某星级酒店中层干部竞聘上岗管理咨询项目纪实

在这次项目合作中,我们的目的主要是设计一次公开、透明的竞聘活动,通过科学、公正的方法选拔出公司管理级岗位的最佳候选人。基于华恒智信的专业性,我们再次选择与其合作开展项目。在项目合作中,专家团队为我们进行了专业性的培训…

AIGC实战——GPT(Generative Pre-trained Transformer)

AIGC实战——GPT 0. 前言1. GPT 简介2. 葡萄酒评论数据集3. 注意力机制3.1 查询、键和值3.2 多头注意力3.3 因果掩码 4. Transformer4.1 Transformer 块4.2 位置编码 5. 训练GPT6. GPT 分析6.1 生成文本6.2 注意力分数 小结系列链接 0. 前言 注意力机制能够用于构建先进的文本…

【网络原理】TCP 协议中比较重要的一些特性(一)

目录 1、TCP 协议 2、确认应答 2.1、确认序号 3、超时重传 4、连接管理 4.1、建立连接(三次握手) 4.2、断开连接(四次挥手) 1、TCP 协议 TCP 是工作中最常用到的协议,也是面试中最常考的协议,具有面…

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist,在electron-builder签名打包时,给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证,若出现这个,则说明成…

Fortran语法介绍(三)

个人专栏—ABAQUS专栏 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则各向同性线弹性材料本构模型…

《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题。 2.源码 本文介绍webdriver中关于浏览器退出操作。driver中有两个方法是关于浏览器关闭&…

SQL28 计算用户8月每天的练题数量

👨‍💻 大唐coding:个人主页 🎁 个人专栏: 《力扣高频刷题宝典》《SQL刷题记录》 ⛵ 既然选择远方,当不负青春,砥砺前行! 大家好,我是大唐,今天我们来做一道牛客题库SQL…

MySQL-----存储过程

▶ 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,…

C switch 语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。 语法 C 语言中 switch 语句的语法: switch(expression){case constant-expression :statement(s);break; /* 可选的 */ca…

C语言中的UTF-8编码转换处理

C语言UTF-8编码的转换 1.C语言简介2.什么是UTF-8编码?2.1 UTF-8编码特点: 3.C语言中的UTF-8编码转换处理步骤1:获取UTF-8编码的字节流步骤2:解析UTF-8编码步骤3:Unicode码点转换为汉字 4.总结 1.C语言简介 C语言是一门…

【面试精讲】Java线程6种状态和工作原理详解,Java创建线程的4种方式

Java线程6种状态和工作原理详解,Java创建线程的4种方式 目录 一、Java线程的六种状态 二、Java线程是如何工作的? 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现…

Node-RED在Linux二次开发网关中能源数据实时采集与优化

智能电网与分布式能源系统已成为推动绿色能源转型的重要载体。为了更好地应对多样化的能源供给与需求挑战,以及实现更高效的能源管理,Linux二次开发网关与Node-RED这一创新组合应运而生。 Linux二次开发网关作为高度定制化的硬件平台,其开源特…

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache? 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache? LRU Cache(Least Recently Used的缩写,即最近最少使用&#xff0…

跨平台是什么意思?——跟老吕学Python编程

跨平台是什么意思?——跟老吕学Python编程 跨平台跨平台释义跨平台软件数据库管理系统(DBMS):网站服务器、应用程序服务器:网络浏览器: 跨平台编程语言跨平台详细解说跨平台应用前景 跨平台 计算机领域术语 跨平台概念是软件开发中…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目,是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…

canvas实现水印逻辑分析

目录 效果图一、相关文档二、分析三、实现1、将水印文字转为水印图片2、给刚生成的水印图片加入旋转以及间隔(1)旋转位移(2)间隔位移(3)最后使用toDataURL导出为png图片 3、将生成的水印图片依次排布在需要…

【Python数据结构与判断2/7】数据和判断小结

目录 序言 print() 变量 赋值 四种数据类型 字符串 格式化输出 四则运算 取整与取模 比较运算 逻辑运算 判断 if语句 if-else语句 if-elif-else语句 Tips 空值、0、非0非空值 实战案例 输入密码 短信模板 总结 序言 今天将对前面学过的内容进行一个复习小结…

科技引领品质:飞利浦智能锁“12年免费换新机”重塑行业新标杆

随着智能锁行业的竞争愈发火热,各大品牌在技术创新和服务升级方面不断推陈出新。售后服务的形态正发生深刻变化,从传统的保修维修到如今的技术支持、24小时在线客服等,各大品牌都在不断地提升售后服务水平,以创新的服务理念和先进…

配置与管理DNS服务器

配置与管理DNS服务器 **1,什么是DNS?**负责将域名转换成实际想对应的ip地址,这个过程交域名解析。 **2,域名解析的方法:**分布式,层次结构的数据库系统。根域,顶级域,二级域&#…