Laravel Scout + Meilisearch 是最轻量、响应最快且不依赖 MySQL 全文索引的搜索方案,需手动部署 Meilisearch、配置 Scout、定义 toSearchableArray、导入数据并验证中文分词与错误日志。

直接用 Laravel Scout + Meilisearch 是目前最轻量、响应最快、且不依赖 MySQL 全文索引配置的方案。它把搜索逻辑完全交给 Meilisearch,避免了 WHERE MATCH AGAINST 的语法限制和分词能力弱的问题。
确认 Meilisearch 服务已就绪并可连通
Scout 不会帮你启动或管理 Meilisearch 实例,必须先确保它在运行且 Laravel 能访问到。常见踩坑点是本地开发时用了默认端口但没开防火墙,或 Docker 容器网络不通。
- 启动 Meilisearch(推荐 Docker):
docker run -d -p 7700:7700 -v $(pwd)/data:/data.ms getmeili/meilisearch:v1.10
- 检查连通性:
curl http://127.0.0.1:7700/health应返回{"status":"available"} - Laravel 中配置
config/scout.php的meilisearch段:'meilisearch' => [ 'host' => 'http://127.0.0.1:7700', 'key' => env('MEILISEARCH_KEY', 'masterKey'), ],注意:Meilisearch v1.0+ 默认 key 是masterKey,不是空字符串
给模型添加 Scout 支持并触发索引同步
不是所有字段都该进搜索索引,也不是所有模型都需要实时同步。Scout 的 toSearchableArray() 方法才是控制实际提交内容的关键入口。
CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、
- 在模型中 use
Searchabletrait,并指定搜索字段:use Laravel\Scout\Searchable; class Article extends Model { use Searchable; protected $fillable = ['title', 'content', 'published_at']; public function toSearchableArray() { return [ 'id' => $this->id, 'title' => $this->title, 'content' => $this->content, 'published_at' => $this->published_at->timestamp, ]; } } - 首次导入数据用:
php artisan scout:import "App\Models\Article" - 增量更新靠模型事件自动触发,但需确保
APP_ENV=local或BROADCAST_DRIVER=log不干扰队列 —— 否则新增/修改不会写入 Meilisearch
执行搜索时控制匹配精度与排序
Meilisearch 默认按相关度(_score)排序,但很多业务需要按时间、热度等二次排序,且要避免“标题含关键词但正文完全无关”的低质结果。
- 基础搜索:
Article::search('laravel')->get()返回 Eloquent 集合 - 模糊匹配增强(容错拼写、部分匹配):
Article::search('laravle') ->where('published_at', '>=', now()->subMonths(6)->timestamp) ->orderBy('published_at', 'desc') ->paginate(15); - 精确短语匹配加双引号:
Article::search('"Laravel Scout"') - 排除某字段干扰(如屏蔽草稿):
->where('status', 'published')—— 这个条件会在 Meilisearch 查询时转为 filter,不参与分词
上线前必须验证的三个边界问题
Meilisearch 在高并发或大数据量下表现稳定,但容易被忽略的是初始化状态、中文分词、以及错误静默。
- 首次部署后务必手动访问
http://your-meilisearch-host:7700/indexes确认 index 已创建,名字默认是articles(模型名复数小写),否则搜索永远返回空 - 中文搜索默认效果差,需在 Meilisearch 启动时加参数:
--experimental-enable-multiple-tenants不解决分词;真正有效的是设置 index 的settings:curl -X POST 'http://127.0.0.1:7700/indexes/articles/settings' \ -H 'Content-Type: application/json' \ --data-binary '{"distinctAttribute":null,"searchableAttributes":["title","content"],"displayedAttributes":["*"]}'(Meilisearch v1.10+ 对中文支持已内置,但旧版本仍需额外插件) - 搜索报错常被 Scout 吞掉,开启调试看真实响应:
MeiliSearch\Endpoints\Indexes::search()抛出异常时,scout.php的soft_delete和queue配置会影响是否重试或记录日志









