跳转到主要内容

简介

Laravel Scout 是一个基于驱动的简洁方案,用于给 Eloquent 模型添加全文检索能力。它通过模型观察者,自动同步 Eloquent 记录与搜索索引。 Scout 内置了 database 引擎,使用 MySQL / PostgreSQL 的全文索引和 LIKE 子句直接搜索数据库,无需外部服务。大规模生产环境中若需要拼写容错、分面搜索、地理搜索,则可以选择外部引擎。

支持的引擎一览

安装

通过 Composer 安装。
安装后,使用 vendor:publish 命令发布配置文件,会生成 config/scout.php
最后在需要可搜索的模型上添加 Laravel\Scout\Searchable trait。该 trait 会注册模型观察者,实现与搜索驱动的自动同步。

配置队列

使用 databasecollection 之外的引擎时,强烈建议先配置好队列驱动。启动队列 worker 后,索引同步会在后台执行,Web 界面的响应速度将大幅提升。 config/scout.php 中的 queue 设为 true
也可以指定连接和队列名。
配置好后启动专用的队列 worker。

使用唯一任务

在写入密集的应用中,你可能希望避免同一模型记录的重复索引任务进入队列。在 config/scout.php 中注册 MakeSearchableUniquelyRemoveFromSearchUniquely 任务类,就能使用唯一化的索引任务。通常在服务提供者的 boot 方法中设置。
这些任务使用 Laravel 的唯一任务锁,防止已在队列中的同一模型记录被重复派发。

各驱动的准备工作

Algolia

使用 Algolia 驱动时,请在 config/scout.php 中配置 idsecret,并安装 Algolia PHP SDK。
.env 中配置凭证。

索引配置

Algolia 可以通过 config/scout.php 管理索引设置。
配置完毕后执行 scout:sync-index-settings 命令,让 Algolia 生效。

Meilisearch

Meilisearch 是一款高性能的开源搜索引擎。本地开发中最简单的方法是使用 Laravel Sail 中的 Docker 服务。
不使用 Sail 时,可以直接用 Docker 启动。
安装 Meilisearch PHP SDK。
.env 中配置驱动与主机。
升级 Scout 时请务必查阅 Meilisearch 本身的破坏性变更

索引配置(Meilisearch)

在 Meilisearch 中,用于 where() 过滤的字段必须提前注册到 filterableAttributes,用于 orderBy() 排序的字段则注册到 sortableAttributes
注意数值列的数据类型。Meilisearch 只会对类型正确的字段执行 >< 之类的过滤操作。
设置完毕后执行 scout:sync-index-settings

Typesense

Typesense 是一款高性能的开源搜索引擎,支持关键字、语义、地理及向量检索。
.env 中配置连接信息。
使用 Typesense 时,toSearchableArray 需要把模型主键 cast 为字符串,把创建时间 cast 为 UNIX 时间戳。

database / collection 引擎

如果希望在不引入外部服务的情况下添加搜索功能,这两种就是最合适的选项。 database 引擎 使用 MySQL / PostgreSQL 的全文索引和 LIKE 子句。多数应用足够使用。
collection 引擎 在 PHP 中过滤,因此可在 Laravel 支持的所有数据库(包括 SQLite)上运行。适合本地开发、测试或小数据集。
数据库引擎不像外部引擎那样需要手动管理索引,它直接搜索数据库表。

Searchable trait

自定义 toSearchableArray()

默认情况下,模型的 toArray() 全部数据都会写入搜索索引。要自定义同步到索引的数据,可以重写 toSearchableArray 方法。

自定义索引名

默认情况下模型的表名(复数)会被用作索引名。可以通过重写 searchableAs 来自定义。

database 引擎的搜索策略

在 database 引擎中,可以通过 PHP Attribute 为每列指定高效的搜索策略。
使用 SearchUsingFullText 之前,请确认目标字段已建立全文索引

有条件地允许搜索

若只想在特定条件下让模型可被搜索,可以定义 shouldBeSearchable 方法。
shouldBeSearchable 对 database 引擎无效。要在 database 引擎上实现类似效果,请使用where 子句

索引管理

本节命令主要针对 Algolia、Meilisearch、Typesense 等外部引擎。database 引擎无需管理索引。

导入已有记录

在已有项目中引入 Scout 时,可以使用 scout:import 命令把已有记录导入索引。
也可以通过队列在后台导入。

清空索引

要从索引中删除某模型的全部记录,可以使用 scout:flush

暂停索引同步

想在一段 Eloquent 操作期间临时停止与索引的同步,使用 withoutSyncingToSearch

手动添加 / 删除记录

可以基于查询把一批模型加入索引。
从索引中移除记录使用 unsearchable
模型 delete 时会自动从索引中删除。

搜索

search 方法用来搜索模型。再链上 get 就可以得到 Eloquent 模型集合。
在控制器或路由中直接返回时会自动转 JSON。
如需拿到原始搜索结果,使用 raw 方法。

分页

paginate 方法用来对搜索结果做分页,用法与普通 Eloquent 查询一致。
在 database 引擎下也可以使用 simplePaginate,因为它不计算总数,对大数据集更高效。
Blade 模板中的展示示例:

过滤与排序

where 方法可以给搜索查询添加过滤条件。
使用 Meilisearch 时,在使用 where 前必须配置可过滤字段
query 方法用来自定义 Eloquent 查询。

Eager Loading

Scout 会先从搜索引擎获得 ID 列表,再用 Eloquent 取回模型。要避免 N+1 问题,可以在 query 方法内使用 with() 提前加载。
批量导入时若也需要 Eager Load 关联,可以定义 makeAllSearchableUsing
makeAllSearchableUsing 在通过队列进行批量导入时可能不生效。队列任务处理模型集合时不会恢复关联。

软删除

如果被索引的模型使用了软删除,并希望在搜索时也能搜到已删除的模型,请把 config/scout.phpsoft_delete 设为 true
启用后可以通过 withTrashedonlyTrashed 搜索已删除记录。

自定义引擎

若内置引擎不能满足需求,可以自行实现自定义引擎。自定义引擎需继承 Laravel\Scout\Engines\Engine 抽象类,并实现下面 8 个方法。
实现时可参考 Laravel\Scout\Engines\AlgoliaEngine 类。 创建的自定义引擎需要在 App\Providers\AppServiceProviderboot 方法中注册。
注册后在 config/scout.php 中作为驱动使用。

相关页面

Eloquent ORM

了解 Eloquent 模型的基础用法。

Eloquent 关联

了解关联定义与 Eager Loading。

队列

Scout 可以配合队列在后台异步同步索引。
最后修改于 2026年7月18日