laravel-scout-elasticsearch连接正常但import报无存活节点怎么办
问题根因
你在自定义ElasticSearchServiceProvider中手动构建的客户端实例,和matchish/laravel-scout-elasticsearch扩展包执行scout:import命令时使用的客户端实例不是同一个。你手动测试连通的是自己实例化的客户端,扩展包内部默认构建的客户端没有加载你配置的地址、认证信息,所以请求失败报No alive nodes错误。
解决步骤
- 发布扩展包官方配置文件,不要自己重复写客户端构建逻辑:
执行以下命令发布配置:
执行后项目php artisan vendor:publish --provider="Matchish\ScoutElasticSearch\ElasticSearchServiceProvider"config目录会生成scout-elasticsearch.php配置文件,直接在.env中补充对应配置即可,扩展包会自动读取参数构建客户端:ELASTICSEARCH_HOST=你的ES服务地址 ELASTICSEARCH_PORT=ES服务端口 ELASTICSEARCH_USER=ES认证账号 ELASTICSEARCH_PASS=ES认证密码 - 如果你需要保留自定义客户端构建逻辑,必须把构建好的实例绑定到容器对应标识,替换扩展包默认的客户端实例:
在自定义服务提供者的register方法中添加以下绑定,注意绑定要早于扩展包服务提供者注册生效:$this->app->singleton(\Elasticsearch\Client::class, function () { return ClientBuilder::create() ->setHosts([ 'http://'.env('ELASTICSEARCH_HOST').':'.env('ELASTICSEARCH_PORT') ]) ->setBasicAuthentication(env('ELASTICSEARCH_USER'), env('ELASTICSEARCH_PASS')) ->build(); }); - 清理配置缓存后重新执行导入命令:
php artisan config:clear php artisan scout:import "App\Models\MyModel"
常见踩坑点:如果ES服务开启了HTTPS,host前缀必须写
https://,错写为http://会导致SSL握手失败,同样会触发节点离线的报错。
内容的提问来源于stack exchange,提问作者Bastien
相关产品推荐
相关产品推荐

