Easysearch from + size 分页查询原理和使用场景介绍
一、基本概念ElasticsearchES的from和size是最基础的分页参数用于在一次查询中控制返回结果的范围。{from:0,size:10,query:{match:{title:elasticsearch}}}from跳过的文档数量偏移量从 0 开始计数。size本次返回的最大文档数。例如from: 20, size: 10表示跳过前 20 条命中取紧随其后的 10 条即第 3 页每页 10 条。二、底层原理分布式检索全貌理解from size的原理必须先理解 Elasticsearch 一次查询请求在执行层做了什么。因为 ES 是分布式系统一次看起来简单的搜索实际经历了三个关键阶段。2.1 三个阶段的完整链路2.2 Query Phase查询阶段——数据在哪一层开始膨胀这是理解from size问题的核心阶段。协调节点将查询广播到索引的每一个相关分片注意不是只发给部分分片而是所有分片都会收到这个请求。然后每个分片在自己的本地数据中独立执行搜索。关键数每个分片返回的不是size条而是from size条。假设索引有 5 个主分片from 1000, size 10那么每个分片必须返回 1010 条结果给协调节点。协调节点要在5 × 1010 5050 条结果中进行排序然后截取第 1000 到 1009 条作为最终响应。之所以是from size而非size是因为每个分片并不知道其他分片会返回什么。为了确保协调节点能正确截取全局的第 1000 到 1009 条每个分片必须贡献全部候选。举个例子如果某个分片恰好包含全部最相关的命中另一个分片一条都没有那么返回少于from size的分片会导致排序时不够用、结果出错。重要澄清from size是每个分片构建的优先队列的容量上限而不是返回数量的硬性下限。每个分片在自己的本地数据中执行查询实际命中多少条就填入多少条——如果某个分片上只匹配到 3 条文档那它返回给协调节点的就只有 3 条远少于from size。同理分片数 × (from size)是协调节点处理量的理论最坏上限实际处理的候选文档数永远 ≤ 这个值。协调节点在发出请求时无法预知数据分布因此必须按最坏情况分配队列容量这正是from size公式作为设计依据的原因——保证无论数据如何分布候选集都足够覆盖全局窗口。官方说明Query Phase 页面明确写道 —— “Each shard executes the query locally and builds a sorted priority queue of lengthfrom size— in other words, enough results to satisfy the global search request all by itself.”Query Phase | Elasticsearch: The Definitive GuideFetch Phase 页面则指出 —— “The coordinating node needs to sort throughnumber_of_shards * (from size)documents in order to find the correctsizedocuments.”Fetch Phase | Elasticsearch: The Definitive Guide实际返回的超集注意 5050 条只是轻量级的 ID 列表加上排序值score 或 sort 字段不是完整文档。协调节点在 Query Phase 将这些 ID 和排序值在内存中做全局归并排序排好后丢弃前 1000 条仅对最终确定的 10 条目标文档发起 Fetch 请求去各分片拉取完整内容。排序过程的计算压力在 5050 这个量级但网络 IO 开销只在最终size这个量级。2.3 Fetch Phase获取阶段协调节点排序完后确定了最终返回哪些文档例如 10 条再向持有这些文档的分片发起 get 请求获取_source等完整信息聚合后返回客户端。三、from size 的性能陷阱与深度问题3.1 内存压力随着from增大协调节点需要在堆内存中维护的临时数据不断膨胀。以上例 5 分片、from 1000 为例协调节点要维护 5050 条文档的排序信息。如果from到达 10000就是 50050 条到达 100000就是 500500 条。每一条信息包括文档 ID 和多个排序字段值。即便不是完整 JSON当分片数和偏移量同时增大时内存占用会迅速变得不可接受。3.2 CPU 压力协调节点需要对所有分片返回的结果做全局归并排序。排序 5 万条 ID 列表本身不算太贵但结合对每个候选文档的排序字段比较和大小判断随着数据量增长这一开销在 offset 很深的场景下会显著增加。3.3 分页结果不一致from size在翻页过程中不保证一致性。这是一个常被忽略的陷阱。当用户翻到第 3 页、第 4 页时每一次翻页都是一个全新的独立搜索请求。如果在这期间有新文档写入、旧文档被删除或更新那么各页之间可能出现文档重复或文档丢失。例如用户先请求 page 1from 0然后请求 page 2from 10。在两次请求之间插入了一条高相关度文档。这条新文档会挤进第 1 页导致原来第 1 页的最后一条滑到第 2 页——用户翻到第 2 页时会看到重复文档第 1 页末尾那条在第二页又出现了。同理如果插入发生在更前面也会造成某些文档被悄然跳过丢失。这是分布式搜索中分页的天然限制不是 ES 的 bug。对于一致性要求高的场景需要使用search_after或scroll。3.4 到底能翻多少页Elasticsearch 默认限制from size 10000由index.max_result_window控制。超过这个值会报错{error:{type:index_out_of_bounds_exception,reason:Result window is too large, from size must be less than or equal to: [10000]}}可以手动调大这个值但不建议。每加深一页协调节点的开销就线性增长。深翻页永远建议用search_after替代。四、适用场景与典型用法4.1 真正适用的场景from size适合浅翻页—— 用户只浏览前几页、数据量不大、翻页操作相对稀疏的场景。典型例子内部管理后台的列表查询用户通常只看前 2-3 页搜索结果的首页展示总量在几千条以内的小索引快速原型和测试场景4.2 不适用 / 应避免的场景以下情况下应尽量不用from size而是使用替代方案深度分页用户可能翻到几十页之后应使用search_after。全量数据导出或批量处理应使用scroll。实时一致性要求高的分页应使用search_after它基于上一页最后一条的排序值定位天然避免重复/丢失。五、替代方案对比方案原理优势劣势from size每个分片返回 fromsize 条协调节点全局排序后截取最简单直观深度分页性能差翻页不一致有 10000 窗口限制search_after基于上一页最后一条的排序值从该位置继续搜索深度分页性能恒定 O(1)实时一致性好不能跳页需要维护游标排序值scroll生成一个时间点快照后续翻页在这个快照上完成适合全量遍历一致性完美快照占用资源不适合实时交互翻页PITPoint in Time search_after创建轻量级时间点 search_after 翻页兼顾一致性和性能ES 7.10 推荐API 稍复杂有一定学习成本5.1 search_after 示例// 第一页GET/my-index/_search{size:10,query:{match:{title:elasticsearch}},sort:[{date:desc},{_id:asc}]}// 第二页使用上一页最后一个文档的 sort 值GET/my-index/_search{size:10,query:{match:{title:elasticsearch}},search_after:[1620000000000,doc-id-abc123],sort:[{date:desc},{_id:asc}]}细节sort中必须包含唯一键如_id作为 tiebreaker否则多个文档有相同的date排序值时分页边界会模糊造成跳过或重复。5.2 PIT search_afterES 7.10 推荐// 1. 创建 PITPOST/my-index/_pit?keep_alive5m// 返回: { id: pit-id-xxx }// 2. 使用 PIT 进行 search_after 翻页GET/_search{size:10,query:{match:{title:elasticsearch}},pit:{id:pit-id-xxx,keep_alive:5m},search_after:[1620000000000,doc-id-abc123],sort:[{timestamp:desc},{_shard_doc:asc}]}// 3. 用完释放 PITDELETE/_pit{id:pit-id-xxx}_shard_doc是 PIT 中的隐式排序字段比_id更高效因为它就是分片内部的顺序。搭配 PIT 使用可以避免用_id做 tiebreaker 在跨分片场景下的不一致问题。六、深翻页性能走向的量化参考当分片数固定为 5 且每次返回 size20 时不同 from 值下的处理量估算如下from 值每分片返回协调节点处理总量约翻到第几页020100第 1 页100120600第 6 页5005202600第 26 页100010205100第 51 页5000502025100第 251 页10000默认上限1002050100第 501 页即便from10000只处理约 5 万条元数据在排序阶段对协调节点来说通常不会立刻出现严重性能问题按现代硬件基准这仍然很快。真正的风险在于分片数量比 5 大很多比如生产集群按 TB 级滚动索引可能有几十个分片参与size也设得很大高并发场景下多个这样的请求同时打过来或者持续往更深页翻超过默认 10000 窗口这些叠加因素才会导致明显问题。对于典型浅翻页场景前 10 页以内from size完全够用无需过度优化。七、总结from size是 Elasticsearch 最直观的分页方式原理是协调节点向所有分片广播查询每个分片返回from size条结果协调节点做全局归并排序后截取对应窗口。它的核心问题是随着from增大协调节点的内存和排序压力线性增长同时翻页之间不保证一致性。但它并不是一用就炸的坏实践——在浅翻页前几页、小数据集、低频场景下它是最简单的方案。一旦翻页深度增加或者一致性要求高就应切换到search_after或scroll其中PIT search_after是当前推荐的通用深翻页方案。实际选择时还应考虑分片数量、并发压力、索引规模三个维度而不是只盯着from这一个变量。

相关新闻

Python电影数据可视化毕设全流程解析与实战

Python电影数据可视化毕设全流程解析与实战

1. 项目概述:Python电影数据可视化毕设全解析 这个基于Python的影片数据可视化毕业设计项目,是当前大数据领域最具实操价值的课题之一。我指导过37个类似项目后发现,90%的学生都会在数据采集清洗、可视化交互设计和远程调试这三个环节踩坑。本…

2026/10/15 5:41:06 阅读更多 →
Honor of Kings 2026.08.02

Honor of Kings 2026.08.02

最近太忙很少玩,2026.08.02.遇到4个傻队友, 【瑶】打野,【猪八戒】上单,【少司缘】辅助,【元流之子】射手 王者荣耀毕竟是娱乐游戏,二货多正常。这场对面的傻子多郑州市惠济区 杏树市啊飞儿, 被4个人嫌弃的…

2026/10/13 19:07:18 阅读更多 →
多GPU分布式推理:Kandinsky 5.0模型并行计算配置与性能优化技巧

多GPU分布式推理:Kandinsky 5.0模型并行计算配置与性能优化技巧

多GPU分布式推理:Kandinsky 5.0模型并行计算配置与性能优化技巧 【免费下载链接】kandinsky-5 Kandinsky 5.0: A family of diffusion models for Video & Image generation 项目地址: https://gitcode.com/gh_mirrors/ka/kandinsky-5 Kandinsky 5.0作为…

2026/10/9 14:20:19 阅读更多 →

最新新闻

Spring Boot 3迁移MyBatis-Plus:SqlSessionFactory缺失根因与修复

Spring Boot 3迁移MyBatis-Plus:SqlSessionFactory缺失根因与修复

前段时间把一个老服务从Spring Boot 2.7往3.2迁移,顺手把MyBatis也换成MyBatis-Plus,结果启动直接抛了一串异常,核心信息就是Error creating bean with name sqlSessionFactory。但更让人头疼的是,控制台给的提示并不统一——有时…

2026/10/15 5:40:35 阅读更多 →
基于Java和SpringBoot的旅游信息网站与景区门票管理系统设计与实现

基于Java和SpringBoot的旅游信息网站与景区门票管理系统设计与实现

毕业设计选这个题目,算是给自己选了一条比较稳的路。基于Java和SpringBoot的旅游信息网站兼旅游景区门票管理系统,这个题目最大的好处是业务边界清晰、技术栈主流、演示效果好,无论做课程设计还是毕业设计,都是一个容易出成果、也…

2026/10/15 5:40:35 阅读更多 →
纸牌+文字叙事:休闲游戏内容化与混合变现的爆款拆解

纸牌+文字叙事:休闲游戏内容化与混合变现的爆款拆解

1. 霸榜数据背后,玩的是什么新东西先聊聊这个标题为什么会让人多看两眼。“纸牌”这个品类在海外市场一直属于典型的闷声发大财赛道:规则几十年不变、用户年龄跨度大、买量成本相对可控、付费习惯稳定。但大多数纸牌产品做的事情都是“把同一个玩法换皮肤…

2026/10/15 5:40:35 阅读更多 →
纸牌+文字剧情:休闲游戏混合变现与买量素材的爆款融合玩法

纸牌+文字剧情:休闲游戏混合变现与买量素材的爆款融合玩法

纸牌文字,这个组合放在三年前没人信,最近半年我反复在美区榜单上蹲它,还真把这条赛道蹲火了。霸榜美国TOP1不是靠榜单玄学,而是靠一套很实的玩法缝合逻辑:传统纸牌游戏的用户基本盘稳定、活跃高,但付费天花…

2026/10/15 5:40:35 阅读更多 →
IPv6工程落地实战:地址规划、NDP排错与华为设备特有陷阱

IPv6工程落地实战:地址规划、NDP排错与华为设备特有陷阱

1. 这份IPv6笔记到底在解决什么问题?“【HCIE备考笔记】【03-IPv6】重点难点整理”——光看标题,你可能以为这只是某位考生随手记下的几页草稿。但实际翻过几十份真实备考资料后你会发现:绝大多数人卡在IPv6,不是因为协议本身多难…

2026/10/15 5:40:35 阅读更多 →
Fontsource 字体解析:Amarante —— 基于 Art Nouveau 的中等对比度展示字体

Fontsource 字体解析:Amarante —— 基于 Art Nouveau 的中等对比度展示字体

前端CLI开发工具 【免费下载链接】fontsource Self-host Open Source fonts in neatly bundled NPM packages. 项目地址: https://gitcode.com/gh_mirrors/fo/fontsource 点击查看 免费下载 Amarante 是 Fontsource 注册表中收录的 Google 系字体之一,由…

2026/10/15 5:39:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →