当前位置: 首页 > article >正文

【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景

`search_after` 确实不支持随机访问(即直接跳到任意一页),因此在前端需要随机跳转到某一页的场景中,使用 `search_after` 是不合适的。这种情况下,更适合使用 `from` 和 `size` 来实现分页。

 

为什么 `search_after` 不支持随机访问

`search_after` 的工作原理是基于排序字段的值,从上一页的最后一个结果之后继续查找下一页的结果。它依赖于结果的顺序性,因此只能顺序分页。如果需要跳转到任意一页,`search_after` 无法直接实现,因为它无法像 `from` 和 `size` 那样通过偏移量直接定位到目标页。

 

前端分页场景的适用性

 

1. 随机访问分页(适合 `from` 和 `size`)

如果前端允许用户直接跳转到任意一页(例如用户可以直接输入页码,或者点击“第 100 页”这样的按钮),那么应该使用 `from` 和 `size`。这种方式可以方便地通过偏移量(`from`)直接定位到目标页。

 

- 优点:

  - 支持随机访问,用户可以自由跳转到任意一页。

  - 实现简单,前端和后端的逻辑都比较直观。

- 缺点:

  - 当分页深度较大时(例如 `from` 值很大),性能会显著下降,因为 Elasticsearch 需要加载和丢弃大量中间结果。

 

2. 顺序分页(适合 `search_after`)

如果前端的分页逻辑是顺序的(例如用户只能通过“下一页”或“上一页”按钮逐步浏览),那么可以使用 `search_after`。这种方式在深度分页时性能更好,因为它不需要加载和丢弃大量中间结果。

 

- 优点:

  - 性能高效,适合深度分页。

  - 资源占用低,对集群的压力小。

- 缺点:

  - 不支持随机访问,用户不能直接跳转到任意一页。

  - 实现相对复杂,需要正确处理排序字段和排序值的传递。

 

前端分页的实现建议

如果你需要在前端实现分页功能,可以根据具体需求选择合适的分页方式:

 

- 如果需要支持随机访问(用户可以跳转到任意一页):

  - 使用 `from` 和 `size`。

  - 在后端查询时,根据前端传入的页码计算 `from` 的值(`from = (page - 1) * size`)。

  - 示例:

    

```json

    GET /my_index/_search

    {

      "from": 990, // 假设每页 10 条,跳转到第 100 页

      "size": 10,

      "query": {

        "match_all": {}

      }

    }

    ```

 

- 如果只需要顺序分页(用户只能通过“下一页”或“上一页”浏览):

  - 使用 `search_after`。

  - 在后端查询时,根据上一页的最后一个结果的排序值,设置 `search_after` 参数。

  - 示例:

    

```json

    GET /my_index/_search

    {

      "size": 10,

      "query": {

        "match_all": {}

      },

      "sort": [

        { "_doc": "asc" }

      ],

      "search_after": ["12345"] // 假设上一页的最后一个结果的 _doc 值为 12345

    }

    ```

 

总结

- 如果前端需要支持随机访问分页(用户可以跳转到任意一页),建议使用 `from` 和 `size`。

- 如果前端只需要顺序分页(用户只能通过“下一页”或“上一页”浏览),并且需要处理大量数据,建议使用 `search_after`。

 

根据你的描述,如果前端允许用户随意点击某一页,那么确实不适合使用 `search_after`,而应该使用 `from` 和 `size` 来实现分页功能。

相关文章:

【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景

search_after 确实不支持随机访问(即直接跳到任意一页),因此在前端需要随机跳转到某一页的场景中,使用 search_after 是不合适的。这种情况下,更适合使用 from 和 size 来实现分页。 为什么 search_after 不支持随机访…...

深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理

文章目录 深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理QObject 的继承关系QObject 的内存与生命周期管理父子对象树结构构造函数中的父对象参数父对象删除时自动删除子对象的原理举例说明 父子对象关系的好处继承关系与构造函数调用顺序信号槽机制与对…...

pikachu通关教程-XSS

XSS XSS漏洞原理 XSS被称为跨站脚本攻击(Cross Site Scripting),由于和层叠样式表(Cascading Style Sheets,CSS)重名,改为XSS。主要基于JavaScript语言进行恶意攻击,因为js非常灵活…...

k8s fsGroup

fsGroup 是 Kubernetes 中 securityContext 的一个字段,用于为 Pod 中的所有容器设置共享的文件系统组 ID(GID)。当你在 Pod 的 securityContext 中设置了 fsGroup,Kubernetes 会对挂载到 Pod 的 所有 volume(卷&#…...

Spring Boot,注解,@ConfigurationProperties

好的,这是上面关于 ConfigurationProperties 注解和 setter 方法的判断题及其解析的中文版本: 该判断题表述为:“使用ConfigurationProperties 注解注入属性值时,必须为对应的属性提供setter方法。” 这个说法是 正确的。 Config…...

AIGC学习笔记(9)——AI大模型开发工程师

文章目录 AI大模型开发工程师008 LangChain之Chains模块1 Chain模块核心知识2 Chain模块代码实战LLMSequentialTransformationRouter AI大模型开发工程师 008 LangChain之Chains模块 1 Chain模块核心知识 组合常用的模块 LLM:最常见的链式操作类型SequentialChain…...

git管理github上的repository

1. 首先注册github并创建一个仓库,这个很简单,网上教程也很多,就不展开说了 2. 安装git,这个也很简单,不过这里有个问题就是你当前windows的用户名即:C/Users/xxx 这个路径不要有中文,因为git …...

STM32学习之WWDG(原理+实操)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

Keil MDK5.37或更高版本不再预装ARM Compiler Version5导致编译错误的解决方法

Keil MDK5.37预装的是最新的ARM Compiler Version6 我们可以先右击查看工程属性 在Target标签下,我们可以看到Compiler Version5就是丢失的 在Target标签下,我们可以看到Compiler Version5就是丢失的 图1 以固件库方式编程,编译之后全是错…...

【iOS(swift)笔记-14】App版本不升级时本地数据库sqlite更新逻辑二

App版本不升级时,又想即时更新本地数据库怎么办? 办法二:从服务器下载最新的sqlite数据替换掉本地的数据(注意是数据不是文件) 稍加调整, // !!!注意!&…...

前端性能优化:提升用户体验的关键策略

引言 在当今快速发展的互联网时代,用户对网页加载速度和交互流畅度的要求越来越高。前端性能优化已成为提升用户体验、降低跳出率、提高转化率的关键因素。本文将深入探讨前端优化的核心策略和实践方法,帮助开发者构建更快、更高效的Web应用。 一、网络…...

Unity-UI组件详解

今天我们来学习Unity的UI的详解,这部分的内容相对较少,对于程序员来说主要的工作是负责将各种格式的图片呈现在显示器上并允许操作这些图片。 本篇帖子的理论依据依然是官方开源的UGUI代码,网址为:GitHub - Unity-Technologies/u…...

基于大模型的短暂性脑缺血发作(TIA)全流程预测与干预系统技术方案

目录 一、系统架构总览二、核心模块详细设计三、系统集成方案四、系统部署拓扑图五、技术验证方案六、健康管理子系统七、安全与合规设计技术指标与性能保障八、HL7 FHIR接口规范九、分层蒸馏方案十、多中心RCT研究设计十一、硬件选型成本优化方案跨模块集成工作流一、系统架构…...

嵌入式学习 D31:系统编程--Framebuf帧缓冲

(1)framebuf帧缓冲 :linux提供的显示设备驱动的接口。 设备路径 : 设备/dev/fb0 * 分辨率:像素点是w * h。 每个像素点色深 RGB:0-255 红绿蓝各3字节(byte)即可描述色深。…...

黑马点评完整代码(RabbitMQ优化)+简历编写+面试重点 ⭐

简历上展示黑马点评 完整代码地址 项目描述 黑马点评项目是一个springboot开发的前后端分离项目,使用了redis集群、tomcat集群、MySQL集群提高服务性能。类似于大众点评,实现了短信登录、商户查询缓存、优惠卷秒杀、附近的商户、UV统计、用户签到、好…...

Java 大视界 -- Java 大数据在智能安防视频监控中的异常事件快速响应与处理机制(273)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

【数据库】安全性

数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密。 1.用户标识与鉴别 用户标识与鉴别(Identification & Authentication)是系统提供的最外层安全保护措施。 2.存取控制 2.1自主存取控制(简称DAC) (1)同一用户对于不同的数据对…...

【图像处理入门】4. 图像增强技术——对比度与亮度的魔法调节

摘要 图像增强是改善图像视觉效果的核心技术。本文将详解两种基础增强方法:通过直方图均衡化拉伸对比度,以及利用伽马校正调整非线性亮度。结合OpenCV代码实战,学会处理灰度图与彩色图的不同增强策略,理解为何彩色图像需在YUV空间…...

D2-基于本地Ollama模型的多轮问答系统

本程序是一个基于 Gradio 和 Ollama API 构建的支持多轮对话的写作助手。相较于上一版本,本版本新增了对话历史记录、Token 计数、参数调节和清空对话功能,显著提升了用户体验和交互灵活性。 程序通过抽象基类 LLMAgent 实现模块化设计,当前…...

HALCON 深度学习训练 3D 图像的几种方式优缺点

HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域,3D 图像数据的处理和分析变得越来越重要,HALCON 作为一款强大的机器视觉软件,提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…...

123网盘SDK-npm包已发布

前言 大家好!今天想和大家分享一个我最近开源的项目:123 网盘 SDK。这个项目已经在 GitHub 开源,最近已经发布到 NPM,可以通过 npm i ked3/pan123-sdk 直接安装使用。 项目背景:为什么要开发这个 SDK? 在…...

强制卸载openssl-libs导致系统异常的修复方法

openssl升级比较麻烦,因为很多软件都会依赖它,一旦强制卸载(尤其是openssl-libs.rpm),就可能导致很多命令不可用,即使想用rpm命令重新安装都不行。 所以,除非万不得已,否则不要轻易去卸载openssl-libs。而且…...

乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴

先放软件下载链接:夸克网盘下载 探索乐播视频v4.0.0纯净版:畅享精彩视听之旅 乐播视频v4.0.0纯净版为广大用户带来了优质的视频观看体验,是一款值得关注的视频类软件。 这款软件的资源丰富度令人惊喜,涵盖了电影、电视剧、综艺、动漫等多种…...

Linux 命令全讲解:从基础操作到高级运维的实战指南

Linux 命令全讲解:从基础操作到高级运维的实战指南 前言 Linux 作为开源操作系统的代表,凭借其稳定性、灵活性和强大的定制能力,广泛应用于服务器、云计算、嵌入式设备等领域。对于开发者、运维工程师甚至普通用户而言,熟练掌握…...

FreeRTOS的简单介绍

一、FreeRTOS介绍 FreeRTOS并不是实时操作系统,因为它是分时复用的 利用CubeMX快速移植 二、快速移植流程 1. 在 SYS 选项里,将 Debug 设为 Serial Wire ,并且将 Timebase Source 设为 TIM2 (其它定时器也行)。为何…...

DeepSeek模型安全部署与对抗防御全攻略

引言 随着DeepSeek模型在企业关键业务中的深入应用,模型安全已成为不可忽视的重要议题。本文将从实际攻防对抗经验出发,系统剖析DeepSeek模型面临的安全威胁,提供覆盖输入过滤、输出净化、权限控制等环节的立体防御方案,并分享红蓝对抗中的最佳实践,助力企业构建安全可靠…...

Docker容器使用手册

Docker是一种轻量级、可移植、自给自足的软件运行环境,用于打包和运行应用程序。它允许开发者将应用及其所有依赖打包成一个镜像(Image),然后基于这个镜像创建出容器(Container)来运行。与虚拟机相比不需要…...

深入解析C++引用:从别名机制到函数特性实践

1.C引用 1.1引用的概念和定义 引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。比如四大名著中林冲,他有一个外号叫豹子头,类比到C里就…...

Fuse.js:打造极致模糊搜索体验

Fuse.js 完全学习指南:JavaScript模糊搜索库 🎯 什么是 Fuse.js? Fuse.js 是一个轻量、强大且无依赖的JavaScript模糊搜索库。它提供了简单而强大的模糊搜索功能,可以在任何 JavaScript 环境中使用,包括浏览器和 Nod…...

MyBatis分页插件(以PageHelper为例)与MySQL分页语法的关系

MyBatis分页插件(以PageHelper为例)与MySQL分页语法关系总结 MyBatis的分页插件(如PageHelper)底层实现依赖于数据库的分页语法。对于MySQL数据库来说,其分页逻辑最终会转化为LIMIT语句,下面展开详细说明&…...