Laravel Scout 是一个基于驱动程序的简单全文搜索解决方案,通过使用模型观察者,Scout
将自动同步 Eloquent
记录的搜索索引。而 Elasticsearch
是一个分布式、RESTful 风格的搜索和数据分析引擎,通过 elastic-scout-driver
来实现Scout
的搜索扩展。
第一步:安装 Elasticsearch
可以自主安装,也可以直接购买云服务;如果通过购买云服务,记得配置好访问白名单。
ES 一般有是否可以自动创建索引的配置,可以按需设置。
有许多 ES 的安装教程,这里略过。
第二步:安装 Composer 扩展包
# Scout
composer require laravel/scout
# ES客户端
composer require babenkoivan/elastic-client
# ES配置迁移
composer require babenkoivan/elastic-migrations
# ES的scout驱动
composer require babenkoivan/elastic-scout-driver
composer require babenkoivan/elastic-scout-driver-plus
第三步:生成配置文件
# 生成配置 `config/scout.php`
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
# 生成 `config/elastic.client.php`
php artisan vendor:publish --provider="Elastic\Client\ServiceProvider"
# 生成 `config/elastic.migrations.php`
php artisan vendor:publish --provider="Elastic\Migrations\ServiceProvider"
第四步:修改配置
在config/elastic.client.php
修改客户端连接配置,增加授权配置,若是无授权访问则可以跳过。
'connections' => [
'default' => [
'hosts' => [
env('ELASTIC_HOST', 'localhost:9200'),
],
'basicAuthentication' => [
env('ELASTIC_USERNAME'),
env('ELASTIC_PASSWORD'),
],
],
],
接着在.env
中添加以下配置项
# 修改scout的默认驱动
SCOUT_DRIVER=elastic
# 自定义scout的索引前缀
SCOUT_PREFIX=test_
# 修改ES客户端配置
ELASTIC_HOST=localhost:9200
ELASTIC_USERNAME=elastic
ELASTIC_PASSWORD=elastic
第五步:编写并执行索引迁移文件
php artisan elastic:make:migration create_post_index
/**
* Run the migration.
*/
public function up(): void
{
Index::create('post', function (Mapping $mapping, Settings $settings) {
$mapping->long('userId');
$mapping->text('name');
});
}
/**
* Reverse the migration.
*/
public function down(): void
{
Index::dropIfExists('post');
}
# 创建迁移表
php artisan migrate
# 执行ES迁移
php artisan elastic:migrate
第六步:模型调整
# 模型注册Trait
use Searchable; // 选用Elastic\ScoutDriverPlus\Searchable
# 获取索引值
public function getScoutKey(): mixed
# 获取索引键
public function getScoutKeyName(): mixed
# 自定义索引名称
public function searchableAs(): string
# 自定义搜索数据
public function toSearchableArray(): array
第七步:数据查询
# 搜索方法,支持简单where条件
Post::search($condition)
# 支持简单where条件
->where('userId', 1)
->whereIn('userId', [1, 2])
# 包含软删除查询
->withTrashed()
# 仅包含软删除查询
->onlyTrashed()
其他:辅助方法
# 数据批量导入
php artisan scout:import "App\Models\Post"
# 数据批量删除
php artisan scout:flush "App\Models\Post"
其他:ES相关配置
- ES 的索引配置
index.max_result_window
默认10000,代表窗口大小 - 查询时添加
track_total_hits: true
,可返回准确的条数,非大概的值
具体每一步的详细教程及方法,关注后续文章。