Laravel如何通过Scout使用ElasticSearch全文搜索

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,可返回准确的条数,非大概的值

具体每一步的详细教程及方法,关注后续文章。

参考文档