Laravel中稳定运行全文搜索需确保Scout驱动匹配Elasticsearch客户端版本(如Laravel 10+配elasticsearch/elasticsearch:^8.0),手动执行scout:import导入数据,模型启用Searchable并正确实现toSearchableArray,ES服务安装对应版本IK分词器且中文字段配置ik_smart或ik_max_word分词器,并在config/services.php中正确设置SSL校验与认证参数。

要在 Laravel 中稳定跑起全文搜索,Scout + Elasticsearch 是主流方案,但配置稍有不慎就搜不到结果。核心不是装完包就行,而是驱动对得上、索引推得进、分词配得准、请求发得通。
确认 Scout 驱动和客户端版本匹配
Scout 默认用 Algolia,必须显式切换为 Elasticsearch 驱动;同时,Laravel 10+ 项目必须搭配 elasticsearch/elasticsearch:^8.0 客户端(对应 ES 8.x),不能用已停更的 tamayo/laravel-scout-elastic 或旧版 elastic/elasticsearch-php。
- 在
.env中设:SCOUT_DRIVER=elasticsearch - 运行
composer require elasticsearch/elasticsearch:^8.0 -
config/scout.php中确保存在elasticsearch配置块,且hosts指向真实地址(如['https://localhost:9200'])
手动触发索引同步,别只靠模型事件
新数据写入时自动同步是理想状态,但首次部署或字段变更后,必须主动导入存量数据。Scout 不会自动建索引结构,也不会校验 mapping 是否生效。
- 运行
php artisan scout:import "App\Models\Post"强制推送全部记录 - 用
curl -X GET "http://localhost:9200/posts/_search?pretty"直接查 ES,确认文档已写入 - 检查模型是否正确实现
Searchabletrait,并在toSearchableArray()中返回要检索的字段(比如漏掉content就搜不到正文)
中文搜索必须配 IK 分词器
Elasticsearch 默认的 standard 分词器对中文基本无效——“数据库优化”会被切成“数”“据”“库”“优”“化”,无法命中完整词义。不装插件、不分词,搜索就是摆设。
- ES 服务需安装与版本匹配的
ik-analyzer插件(例如 ES 8.1.1 对应 ik 8.1.1) - 建索引时指定中文字段使用
ik_smart或ik_max_word分词器(可通过customIndexSettings()方法或直接调用 ES API 实现) - 验证分词效果:用
_analyzeAPI 测试,例如POST /posts/_analyze?pretty,body 带{"text":"Laravel中文教程","analyzer":"ik_smart"}
连接配置绕过 HTTPS 验证(仅开发环境)
ES 8.x 默认启用 HTTPS 和安全认证,本地开发若用自签名证书,PHP cURL 会拒绝连接,报错 cURL error 60 或 Unauthorized。
- 在
config/services.php中配置es项,明确关闭 SSL 校验:'ssl' => ['verify_peer' => false, 'verify_host' => false] - 若启用了安全模块,需传 basic auth:
'basic_authentication' => ['username' => 'elastic', 'password' => env('ES_PASSWORD')] - 确保
hosts地址带协议前缀(https://或http://),且端口正确(默认 9200)


















