Laravel ES首页分页查询参数传递标准写法

胖雪大大_2329

胖雪大大_2329

2026-08-17

762人浏览

原创

es分页必须用from和size,不能用laravel的page逻辑;from需手动计算为(page-1)*size,且须配合唯一排序字段防偏移;total应取实际id数而非es估算值,url参数需withquerystring透传。

laravel es首页分页查询参数传递标准写法

ES分页参数必须用 fromsize,不能套用 Eloquent 的 page 逻辑

直接把 Laravel 的 paginate(15) 思路搬进 ES 查询会出错——ES 不认 page 参数,它只按偏移量(from)和单页数量(size)算。比如第 3 页、每页 16 条,就得手动算:from = (3 - 1) * 16 = 32,再传 size = 16

常见错误是写成 "from": 3, "size": 16,结果只拿到第 4 条开始的 16 条,漏掉前 3 页数据。也有人误把 page 当成 ES 的原生字段塞进 query body,ES 直接报 parse_exception

  • from 是从第几条开始取(0 起始),不是“第几页”
  • size 最大建议不超过 10000(受 ES index.max_result_window 限制)
  • 前端传 ?page=2&size=20 时,后端要转换:from = ($page - 1) * $size

sort 字段必须有唯一性,否则翻页会重复或丢失数据

ES 的分页依赖排序稳定性。如果只按 scorerating 排序,多个文档 score 相同,ES 返回顺序可能波动,导致第 2 页出现第 1 页已返回过的 ID —— 这就是 offset 漂移。真实场景中,用户刷两次第 2 页,看到的记录不一致。

正确做法是:在业务排序字段后追加一个唯一字段兜底,比如 ["sold_count:desc", "id:asc"]["created_at:desc", "_id:asc"]。注意 _id 是字符串类型,升序降序不影响唯一性,但能强制打破并列。

  • 避免单独用 ["price:asc"] 这类高重复值字段排序
  • 不要用 script_score 动态算分后排序,性能差且难保证稳定性
  • 如果业务允许,优先用 cursorPaginate 替代 offset 分页(但 ES 原生不支持游标,需自行实现)

总数 total 来自 ES,但别直接喂给 LengthAwarePaginator

ES 返回的 $result['hits']['total']['value'] 是匹配总数,看起来可以直接当 $total 传给 LengthAwarePaginator。但这里有个坑:ES 的 total 默认是“估算值”("relation": "eq" 才是精确值),尤其数据量大、开了分片时,total 可能比实际少几条。

Laravel
Laravel

避免常见的Laravel错误:N+1查询、批量赋值、缓存陷阱及队列序列化陷阱。

下载

更关键的是:你最终查数据库用的是 whereIn('id', $ids),而 ES 返回的 _id 可能对应不到 DB 的 id 字段(比如 ES 存的是字符串 ID,DB 是自增整型;或 ES 同步延迟导致部分数据未写入)。这时候 $total 是虚的,LengthAwarePaginator 显示 “共 127 条”,但第 9 页实际查不到数据。

  • 稳妥做法:用 $result['hits']['total']['value'] 显示“约 XX 条”,不用于分页器构造
  • 分页器的 $total 应设为 count($productIds)(即 ES 真实返回的 ID 数量),避免跳转失败
  • 如果必须显示精确总数,得在 ES 查询里加 "track_total_hits": true,但会轻微拖慢响应

URL 参数透传要用 withQueryString(),但 page 键名不能硬编码

ES 查询结果渲染的 Blade 页面里调 $products->links(),默认会生成 ?page=2 链接。但你的搜索 URL 可能是 /products?search=phone&order=price_desc&page=2,如果控制器没做透传,点下一页就丢掉 searchorder,变成纯 ?page=3

解决方法不是在每个链接里手拼参数,而是用 withQueryString()。但它有个前提:分页器实例必须由你手动 new 出来(因为 ES 查询不走 Eloquent,paginate() 不可用),且 new 时传的 $currentPage 必须从 request 里读,不能写死 request()->input('page', 1) —— 否则换掉参数名(比如改成 p)就失效。

  • 正确读法:$page = $request->input($pageName, 1),然后 new LengthAwarePaginator(..., $page, [...'pageName' => $pageName...])
  • 调用 $pager->withQueryString() 前,确保所有需要保留的参数已在 request 中(searchorder 等)
  • 不要在 withPath() 里写带查询参数的路径,比如 withPath('/products?search=xxx'),这会导致链接嵌套乱码

ES 分页最易被忽略的其实是数据一致性:ES 的 _id 和 DB 主键映射是否 100% 对齐、同步延迟有没有被监控、total 显示要不要加“约”字提示用户——这些不写进代码,光靠 from/size 算对了也没用。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

817

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

795

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2328

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3221

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

4470

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

3016

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

5769

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1336

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

175

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 178人学习

Composer手册
Composer手册

共0课时 | 0人学习