Elasticsearch 分页机制及其深度分页问题解析

ops/2024/10/16 2:27:58/

Elasticsearch 分页机制及其深度分页问题解析

引言

在处理大规模数据集时,分页是常见的需求,尤其是在搜索引擎中。Elasticsearch,作为一个高效的搜索引擎,提供了几种分页机制来满足不同的使用场景。然而,深度分页可能会带来性能问题。本文将介绍 Elasticsearch 的分页机制,包括基础的 fromsize 参数,以及深度分页的解决方案和问题。

基础分页

Elasticsearch 默认情况下只返回前 10 条数据。若要获取更多数据,可以通过修改 fromsize 参数来实现。

基础分页示例

GET /hotel/_search
{"query": {"match_all": {}},"from": 10,  // 分页开始的位置,默认为0"size": 10,  // 期望获取的文档总数"sort": [{"price": "asc"}]
}

在这个例子中,我们从第 11 条记录开始获取,一共获取 10 条记录,并且按照价格升序排序。

深度分页解决方案

对于深度分页,Elasticsearch 提供了两种解决方案:search_afterscroll

search_after

search_after 是基于排序值的分页方式,适用于需要随机访问特定页的场景。

search_after 示例
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": "asc"}],"search_after": [currentLastPrice]  // 从当前页最后一条记录的价格开始查询下一页
}

scroll

scroll 通过在内存中保存数据的快照来实现分页,适用于连续访问大量数据的场景,但会占用额外的内存资源。

scroll 示例
GET /hotel/_search
{"size": 1000,"query": {"match_all": {}},"sort": [{"price": "asc"}],"scroll": "1m"  // 保留搜索上下文1分钟
}

深度分页问题

深度分页指的是当 from + size 的值非常大时,可能会对 Elasticsearch 集群造成性能问题。

深度分页示例

假设我们有一个包含 10000 条记录的索引,并且想要获取第 9500 到 9509 条记录:

GET /hotel/_search
{"from": 9500,"size": 10,"query": {"match_all": {}},"sort": [{"price": "asc"}]
}

深度分页问题解析

  1. 每个分片排序:首先,在每个数据分片上都进行排序并查询前 10000 条文档。
  2. 结果聚合:然后将所有节点的结果在内存中聚合并重新排序,选出前 10000 条文档。
  3. 选取特定区间:最后,从这 10000 条中选取从 9500 开始的 10 条文档。

如果搜索页数过深,或者结果集(from + size)越大,对内存和 CPU 的消耗也越高。Elasticsearch 默认结果集查询的上限是 10000。

集群示例

假设我们有 500 个分片的集群,每个分片需要处理 20 条记录(from + size = 20)。在这种情况下,每个分片都需要进行排序,然后集群需要聚合所有分片的结果并重新排序以提供最终的 20 条记录。如果 from 值很大,比如 9500,那么每个分片都需要处理大量的数据,这将大大增加集群的负担。

结语

Elasticsearch 的分页机制提供了灵活的数据检索方式,但在使用深度分页时需要注意性能问题。search_afterscroll 是两种推荐的深度分页解决方案,它们可以有效地避免基础分页参数带来的性能问题。了解这些机制对于构建高效、可扩展的搜索应用至关重要。希望本文能帮助你在实际项目中更好地利用 Elasticsearch 的分页功能。


http://www.ppmy.cn/ops/94958.html

相关文章

React学习-初始化react项目

目标: reactv18:->1.核心的22中api2路由3.数据状态管理:redux项目: 1.b端业务闭环:登录方案、权限设计、用户管理方案、业务功能、系统架构设计、路由设计流程闭环:开发环境、生产环境、测试环境、代码规范、分支管理规范、项…

河南萌新联赛2024第(五)场:信息工程大学

A 日历游戏 题目描述 Alice 和 Bob 在玩一个游戏,他们先从 2000.1.1 到 2024.8.1 这个日期之间(不包括2024.8.1)随意抽取一个日期出来。然后他们轮流对这个日期进行操作: 把日期的天数加 1,例如:2000.1.1…

无人机培训机构培训计划详解

随着无人机技术的快速发展和广泛应用,无人机操作员的培训与认证成为保障无人机安全、高效运行的重要环节。本文将详细解析无人机培训机构的培训计划,涵盖基础理论与法规、飞行与气象知识、技能操作培训、高级应用课程、实操与模拟训练、安全与应急处理以…

云计算运维和SRE是一回事儿吗?有什么区别?

作为一名运维,你可能听过这两个词:云计算运维和SRE。有的人把他俩混用,你可能会有点迷惑,云计算运维和SRE是一个东西吗? 今天就来简单讨论一下云计算运维和SRE。 一、什么是云计算运维? 云计算没有专属的…

浅析JavaScript 堆内存及其通过 Chrome DevTools 捕获堆快照的方法

JavaScript 的堆内存(Heap Memory)是内存中专门用于存放程序执行过程中动态生成的对象、函数实例以及其他动态数据结构的区域。与调用栈(Call Stack)专注于管理函数调用的顺序和执行环境不同,堆内存则专注于动态地分配…

喷淋温湿度氙灯老化试验箱

氙灯试验箱是一种模拟全阳光光谱的试验设备,主要用于测试材料在紫外光、可见光和红外光等不同光谱环境下的耐候性能。它采用氙弧灯作为光源,通过设定各种试验参数,如温度、湿度和辐照度等,来模拟自然环境中的光照条件,…

优化系统性能:解析Web层缓存与Redis应用的挑战与应对策略

在当今高速发展的互联网环境中,系统性能的优化直接关系到用户体验和系统稳定性。Web层缓存和Redis作为常用的技术手段,在提高系统响应速度和减轻数据库压力方面扮演着重要角色。然而,它们的应用也伴随着一系列挑战。本文将深入探讨Web层缓存与…

无人机灯光含义的详解!!!

一、LED指示灯和状态指示灯 LED指示灯:通常位于飞行器的头部机臂上,用于显示无人机的当前状态。 状态指示灯:位于尾部机臂上,提供更多关于无人机状态的信息。 红绿黄灯交替闪烁 表示无人机正在进行系统自检。稍等片刻&#xf…