Laravel Scout
介绍
Laravel Scout 为 Eloquent models 的全文搜索提供了一个简单的基于驱动程序的解决方案,通过使用模型观察者,Scout 将自动同步 Eloquent 记录的搜索索引。
目前,Scout 附带 Algolia, Meilisearch, 和 MySQL / PostgreSQL (database
) 驱动程序。此外,Scout 包括一个「collection」驱动程序,该驱动程序专为本地开发使用而设计,不需要任何外部依赖项或第三方服务。此外,编写自定义驱动程序很简单,你可以使用自己的搜索实现自由扩展 Scout。
安装
首先,通过 Composer 软件包管理器安装 Scout:
composer require laravel/scout
Scout 安装完成后,使用 Artisan 命令 vendor:publish
生成 Scout 配置文件。此命令将会在你的 config
目录下 生成一个 scout.php
配置文件:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
最后,在你要做搜索的模型中添加 Laravel\Scout\Searchable
trait 。这个 trait 会注册一个模型观察者来保持模型和搜索驱动的同步:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
}
驱动的先决条件
Algolia
使用 Algolia 驱动时,需要在 config/scout.php
配置文件配置你的 Algolia
id
和 secret
凭证。配置好凭证之后,还需要使用 Composer 安装 Algolia PHP SDK:
composer require algolia/algoliasearch-client-php
Meilisearch
Meilisearch 是一个速度极快的开源搜索引擎。如果你不确定如何在本地机器上安装 MeiliSearch,你可以使用 Laravel 官方支持的 Docker 开发环境 Laravel Sail。
使用 MeiliSearch 驱动程序时,你需要通过 Composer 包管理器安装 MeiliSearch PHP SDK:
composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle
然后,在应用程序的 .env
文件中设置 SCOUT_DRIVER
环境变量以及你的 MeiliSearch host
和 key
凭据:
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=masterKey
更多关于 MeiliSearch 的信息,请参考 MeiliSearch 技术文档。
此外,你应该通过查看 MeiliSearch 关于二进制兼容性的文档确保安装与你的 MeiliSearch 二进制版本兼容的 meilisearch/meilisearch-php
版本。
Meilisearch service itself. 注意:在使用 MeiliSearch 的应用程序上升级 Scout 时,你应该始终留意查看关于 MeiliSearch 升级发布的其他重大(破坏性)更改,以保证升级顺利。
队列
虽然不强制要求使用 Scout,但在使用该库之前,强烈建议配置一个队列 驱动。运行队列 worker 将允许 Scout 将所有同步模型信息到搜索索引的操作都放入队列中,从而为你的应用程序的Web界面提供更快的响应时间。
一旦你配置了队列驱动程序,请将 config/scout.php
配置文件中的 queue
选项的值设置为 true
:
'queue' => true,
即使将 queue
选项设置为 false
,也要记住有些 Scout 驱动程序(如 Algolia 和 Meilisearch)始终异步记录索引。也就是说,即使索引操作已在 Laravel 应用程序中完成,但搜索引擎本身可能不会立即反映新记录和更 新记录。
要指定 Scout 使用的连接和队列,请将 queue
配置选项定义为数组:
'queue' => [
'connection' => 'redis',
'queue' => 'scout'
],
配置
配置模型索引
每个 Eloquent 模型都与一个给定的搜索「索引」同步,该索引包含该模型的所有可搜索记录。换句话说,可以将每个索引视为 MySQL 表。默认情况下,每个模型将持久化到与模型的典型「表」名称匹配的索引中。通常,这是模型名称的复数形式;但是,你可以通过在模型上重写 searchableAs
方法来自定义模型的索引:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
/**
* 获取与模型关联的索引的名称.
*/
public function searchableAs(): string
{
return 'posts_index';
}
}
配置可搜索数据
默认情况下,给定模型的 toArray
形式的整个内容将被持久化到其搜索索引中。如果要自定义同步到搜索索引的数据,可以重写模型上的 toSearchableArray
方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
/**
* 获取模型的可索引数据。
*
* @return array<string, mixed>
*/
public function toSearchableArray(): array
{
$array = $this->toArray();
// 自定义数据数组...
return $array;
}
}
一些搜索引擎(如 Meilisearch)只会在正确的数据类型上执行过滤操作(>
、 <
等)。因此,在使用这些搜索引擎并自定义可搜索数据时,你应该确保数值类型被转换为正确的类型:
public function toSearchableArray()
{
return [
'id' => (int) $this->id,
'name' => $this->name,
'price' => (float) $this->price,
];
}
配置可过滤数据和索引设置 (Meilisearch)
与 Scout 的其他驱动程序不同,Meilisearch 要求你预定义索引搜索设置,例如可过滤属性、可排序属性和其他支持的设置字段。
可过滤属性是你在调用 Scout 的 where
方法时想要过滤的任何属性,而可排序属性是你在调用 Scout 的 orderBy
方法时想要排序的任何属性。要定义索引设置,请调整应用程序的 scout
配置文件中 meilisearch
配置条目的 index-settings
部分:
use App\Models\User;
use App\Models\Flight;
'meilisearch' => [
'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
'key' => env('MEILISEARCH_KEY', null),
'index-settings' => [
User::class => [
'filterableAttributes'=> ['id', 'name', 'email'],
'sortableAttributes' => ['created_at'],
// 其他设置字段...
],
Flight::class => [
'filterableAttributes'=> ['id', 'destination'],
'sortableAttributes' => ['updated_at'],
],
],
],
如果给定索引下的模型可以进行软删除,并且已包含在index-settings
数组中,Scout 将自动支持在该索引上过滤软删除的模型。如果你没有其他可过滤或可排序的属性来定义软删除的模型索引,则可以简单地向该模型的index-settings
数组添加一个空条目:
'index-settings' => [
Flight::class => []
],
在配置应用程序的索引设置之后,你必须调用 scout:sync-index-settings
Artisan 命令。此命令将向 Meilisearch 通知你当前配置的索引设置。为了方便起见,你可能希望将此命令作为部署过程的一部分:
php artisan scout:sync-index-settings
配置模型ID
默认情况下,Scout 将使用模型的主键作为存储在搜索索引中的模型唯一ID/键。如果你需要自定义此行为,可以重写模型的 getScoutKey
和 getScoutKeyName
方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class User extends Model
{
use Searchable;
/**
* 获取这个模型用于索引的值.
*/
public function getScoutKey(): mixed
{
return $this->email;
}
/**
* 获取这个模型用于索引的键.
*/
public function getScoutKeyName(): mixed
{
return 'email';
}
}
设置模型的搜索引擎
当进行搜索时,Scout 通常会使用应用程序的 scout
配置文件中指定的默认搜索引擎。但是,可以通过在模型上覆盖 searchableUsing
方法来更改特定模型的搜索引擎:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Engines\Engine;
use Laravel\Scout\EngineManager;
use Laravel\Scout\Searchable;
class User extends Model
{
use Searchable;
/**
* 获取这个模型用于索引的搜索引擎.
*/
public function searchableUsing(): Engine
{
return app(EngineManager::class)->engine('meilisearch');
}
}
配置模型ID
默认情况下,Scout 将使用模型的主键作为存储在搜索索引中的模型的唯一ID /键。如果你需要自定义此 行为,你可以覆盖模型上的getScoutKey
和getScoutKeyName
方法:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class User extends Model
{
use Searchable;
/**
* 获取用于索引模型的值.
*/
public function getScoutKey(): mixed
{
return $this->email;
}
/**
* 获取用于索引模型的键名.
*/
public function getScoutKeyName(): mixed
{
return 'email';
}
}
按型号配置搜索引擎
搜索时,Scout 通常使用你应用程序的 Scout 配置文件中指定的默认搜索引擎。然而,可以通过覆盖模型上的searchableUsing
方法来更改特定模型的搜索引擎:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Engines\Engine;
use Laravel\Scout\EngineManager;
use Laravel\Scout\Searchable;
class User extends Model
{
use Searchable;
/**
* 获取用于索引模型的引擎.
*/
public function searchableUsing(): Engine
{
return app(EngineManager::class)->engine('meilisearch');
}
}
识别用户
如果你在使用 Algolia 时想要自动识别用户,Scout 可以帮助你。将已认证的用户与搜索操作相关联,可以在 Algolia 的仪表板中查看搜索分析时非常有用。你可以通过在应用程序的 .env
文件中将 SCOUT_IDENTIFY
环境变量定义为 true
来启用用户识别:
SCOUT_IDENTIFY=true
启用此功能还会将请求的 IP 地址和已验证的用户的主要标识符传递给 Algolia,以便将此数据与用户发出的任何搜索请求相关联。
数据库/集合引擎
数据库引擎
注意:目前,数据库引擎支持 MySQL 和 PostgreSQL。
如果你的应用程序与小到中等大小的数据库交互或工作负载较轻,你可能会发现使用 Scout 的 「database」 引擎更为方便。数据库引擎将使用 「where like」子句和全文索引来过滤你现有数据库的结果,以确定适用于你查询的搜索结果。
要使用数据库引擎,你可以简单地将 SCOUT_DRIVER
环境变量的值设置为 database
,或直接在你的应用程序的 scout
配置文件中指定 database
驱动程序:
SCOUT_DRIVER=database
一旦你已将数据库引擎指定为首选驱动程序,你必须配置你的可搜索数据。然后,你可以开始执行搜索查询来查询你的模型。使用数据库引擎时,不需要进行搜索引擎索引,例如用于填充 Algolia 或 Meilisearch 索引所需的索引。
自定义数据库搜索策略
默认情况下,数据库引擎将对你所配置为可搜索的每个模型属性执行 「where like」 查询。然而,在某些情况下,这可能会导致性能不佳。因此,数据库引擎的搜索策略可以配置,以便某些指定的列利用全文搜索查询,或者仅使用 「where like」 约束来搜索字符串的前缀(example%
),而不是在整个字符串中搜索(%example%
)。
为了定义这种行为,你可以将 PHP 属性赋值给你的模型的 toSearchableArray 方法。任何未被分配其他搜索策略行为的列将继续使用默认的「where like」策略:
use Laravel\Scout\Attributes\SearchUsingFullText;
use Laravel\Scout\Attributes\SearchUsingPrefix;
/**
* 获取模型的可索引数据数组。
*
* @return array<string, mixed>
*/
#[SearchUsingPrefix(['id', 'email'])]
#[SearchUsingFullText(['bio'])]
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'bio' => $this->bio,
];
}
注意:在指定列应使用全文查询约束之前,请确保已为该列分配全文索引。
集合引擎
在本地开发过程中,你可以自由地使用 Algolia 或 Meilisearch 搜索引擎,但你可能会发现使用「集合」引擎更加方便。集合引擎将使用「where」子句和集合过滤器来从你现有的数据库结果中确定适用于你查询的搜索结果。当使用此引擎时,无需对可搜索模型进行「索引」,因为它们只需从本地数据库中检索即可。
要使用收集引擎,你可以简单地将 SCOUT_DRIVER
环境变量的值设置为 collection
,或者直接在你的应用的 scout
配置文件中指定 collection
驱动程序:
SCOUT_DRIVER=collection