Search after解决ES深度分页问题

embedded/2025/3/18 6:46:51/

文章目录

  • 1、search_after 的作用和意义
  • 2、search_after 的工作原理
  • 3、search_after 的使用方法
  • 4、注意事项
  • 5、与传统分页的对比
  • 6、总结

search_after 是 Elasticsearch 中用于实现深度分页的一种机制。相比于传统的 from 和 size 分页方式,search_after 更适合处理大数据集的分页查询,因为它避免了深度分页带来的性能问题。

1、search_after 的作用和意义

传统分页的问题
在 Elasticsearch 中,使用 from 和 size 进行分页时,每次查询都需要从索引的第一个文档开始扫描,直到找到 from 指定的位置。对于深度分页(例如 from=10000, size=10),这种方式会导致性能急剧下降,因为需要扫描大量文档。

search_after 的优势

  • 性能优化:search_after 通过基于排序值的游标机制,避免了从头扫描文档的开销。

  • 适合大数据集:特别适合需要分页查询大量数据的场景。

  • 实时性:search_after 是基于实时数据的,能够反映索引的最新状态。

适用场景

  • 需要分页查询大量数据(例如日志数据、时间序列数据)。

  • 需要实现“无限滚动”或“加载更多”功能。

  • 需要避免深度分页的性能问题。

2、search_after 的工作原理

search_after 的工作原理是基于排序字段的值。每次查询时,Elasticsearch 会返回一组排序值(sort 字段),下一次查询时可以使用这些值作为游标,从上次查询结束的位置继续查询。

注意事项

  • 必须指定一个或多个排序字段(sort)。

  • 排序字段的值必须是唯一的,否则可能会导致分页不准确。

  • 使用 search_after 时,from 参数必须设置为 0 或省略。

3、search_after 的使用方法

步骤
1:第一次查询:

  • 指定排序字段(例如 @timestamp 和 _id)。

  • 设置 size 参数,确定每页返回的文档数量。

  • 不设置 search_after 参数。

2:后续查询:

  • 使用上一次查询返回的最后一个文档的排序值作为 search_after 参数。

  • 继续指定相同的排序字段和 size 参数。

示例

假设有一个索引 logs,存储日志数据,字段包括 @timestamp 和 message。我们需要按时间顺序分页查询日志。

第一次查询

GET /logs/_search
{"size": 10,"sort": [{ "@timestamp": "asc" },{ "_id": "asc" }]
}

响应结果

{"hits": {"hits": [{"_id": "1","_source": {"@timestamp": "2023-10-01T00:00:00Z","message": "Log entry 1"},"sort": [ "2023-10-01T00:00:00Z", "1" ]},{"_id": "2","_source": {"@timestamp": "2023-10-01T00:01:00Z","message": "Log entry 2"},"sort": [ "2023-10-01T00:01:00Z", "2" ]},...]}
}

第二次查询

使用第一次查询的最后一个文档的排序值作为 search_after 参数:

GET /logs/_search
{"size": 10,"sort": [{ "@timestamp": "asc" },{ "_id": "asc" }],"search_after": [ "2023-10-01T00:01:00Z", "2" ]
}

响应结果

{"hits": {"hits": [{"_id": "3","_source": {"@timestamp": "2023-10-01T00:02:00Z","message": "Log entry 3"},"sort": [ "2023-10-01T00:02:00Z", "3" ]},{"_id": "4","_source": {"@timestamp": "2023-10-01T00:03:00Z","message": "Log entry 4"},"sort": [ "2023-10-01T00:03:00Z", "4" ]},...]}
}

4、注意事项

  • 排序字段的唯一性:如果排序字段的值不唯一,可能会导致分页不准确。因此,通常需要结合 _id 或其他唯一字段进行排序。

  • 实时性:search_after 是基于实时数据的,因此在分页过程中,如果有新文档插入或旧文档删除,可能会导致分页结果不一致。

  • 性能优化:尽量选择高效的排序字段(例如数值字段或日期字段),避免使用文本字段进行排序。

5、与传统分页的对比

特性fromsize 分页search_after 分页
性能深度分页性能差深度分页性能好
适用场景小数据集分页大数据集分页
实时性基于查询时的快照基于实时数据
实现复杂度简单需要维护排序值
内存占用高(需要缓存大量文档)低(仅缓存排序值)

6、总结

search_after 是 Elasticsearch 中用于实现高效深度分页的机制。它通过基于排序值的游标机制,避免了传统分页的性能问题,特别适合处理大数据集的分页查询。使用时需要注意排序字段的唯一性和实时性,并结合实际场景选择合适的排序字段。


http://www.ppmy.cn/embedded/173514.html

相关文章

Redis Sentinel (哨兵模式)深度解析:构建高可用分布式缓存系统的核心机制

一、传统主从复制的痛点 在分布式系统架构中,Redis 作为高性能缓存和数据存储解决方案,其可用性直接关系到整个系统的稳定性。传统的主从复制架构虽然实现了数据冗余,但在面临节点故障时仍存在明显缺陷: ​手动故障转移&#xf…

HarmonyOS第22天:解锁鸿蒙服务开发

走进鸿蒙服务开发的世界 在移动应用开发的领域中,HarmonyOS 以其独特的分布式理念和强大的系统能力,为开发者们开辟了一片崭新的天地。其中,服务开发作为 HarmonyOS 应用开发的关键环节,犹如一把神奇的钥匙,能够帮助开…

电脑自动关机故障维修案例分享

电脑基本配置: C P U: AMD A10 9700 内存:8G 硬盘:金邦512G固态硬盘 主板:华硕 A320M-F 显卡:集成(核心显卡) 操作系统:Win10专业版 故障描述: 使用一段时间会黑屏…

mac电脑如何将wps接入deepseek (傻瓜式教学)

我的是mac pro m4 pro版本,版本不同页面或许有些许差异 首先将wps更新到最新的版本,并打开,点击 + 号 新建一个word文档 点击空白文档 点击开发工具,如果没有开发工具,可以先点击工具,在里面找到开发工具,然后点击宏安全性,设置为低,如下图所示

Linux命令学习使用列表

Linux命令学习使用列表 1 系统启动相关2 系统网络相关3 系统磁盘相关4 系统定时任务5 系统进程监控 1 系统启动相关 1.1 麒麟V10 sp3修改选择默认启动项 2 系统网络相关 2.1 Linux IP 配置  2.2 ping监测网络通信情况 3 系统磁盘相关 4 系统定时任务 5 系统进程监控 5.1 L…

MySQL 密码设置与开机自启动详解

文章目录 一、MySQL 密码设置1. **首次设置密码(适用于安装后未设置密码的情况)**2. **修改已有密码** 二、设置 MySQL 开机自启动1. **Linux 系统(systemd)**2. **Windows 系统** 三、常见问题 以下是针对 Linux(如 U…

自动驾驶中基于潜在世界模型学习多概率决策(LatentDriver)

Learning Multiple Probabilistic Decisions from Latent World Model in Autonomous Driving 问题 图a是将模型与规划器结合,但是这样对不确定性的考虑不全面,尤其是在涉及到自车与环境交互时的动作 图b是将世界模型的知识隐式地转移到规划器中&#…

正则表达式(复习)

文章目录 一、[]: 一个字符集合二、{}: 重复次数三、特殊符号四、(): 分组五、python代码示例六、注意 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个…