vxm / yii2-searchable
为 Yii2 活动记录提供简单的全文搜索
Requires
- php: >=7.1
- teamtnt/tntsearch: ~2.0
- yiisoft/yii2: >=2.0.14.2
- yiisoft/yii2-queue: ^2.2
This package is auto-updated.
Last update: 2024-09-17 03:53:37 UTC
README
关于它
一个扩展,它提供了简单的全文搜索功能,灵感来源于 laravel/scout,并且基于 teamtnt/tntsearch 的 Yii2 Active Record 包装器。
要求
安装
使用 Composer 安装 Yii2 Searchable
composer require vxm/yii2-searchable
最后,添加 \vxm\searchable\SearchableTrait
特性,并将 vxm\searchable\SearchableBehavior
行为附加到您想要进行搜索的 Active Record。这将帮助同步模型与索引数据。
use vxm\searchable\SearchableBehavior; use vxm\searchable\SearchableTrait; class Article extends ActiveRecord { use SearchableTrait; /** * @inheritDoc */ public function behaviors() { return [ 'searchable' => SearchableBehavior::class ]; } }
队列
尽管使用此扩展不是强制性的,但在使用扩展之前,您应强烈考虑配置 yii2-queue。运行队列工作进程将允许它将同步模型信息到搜索索引的所有操作排队,为您的应用程序的 Web 界面提供更好的响应时间。
一旦您配置了队列组件,请将应用程序配置文件中的队列选项值设置为该组件的组件 ID 或其数组配置。
'components' => [ 'searchable' => [ 'class' => 'vxm\searchable\Searchable', 'queue' => 'queueComponentId' ] ]
配置
配置组件
默认情况下,将通过引导以 searchable
ID 将组件添加到您的应用程序组件中。如果您需要配置它,可以在您的应用程序配置文件中手动配置。
'components' => [ 'searchable' => [ 'class' => 'vxm\searchable\Searchable', 'storagePath' => '@runtime/vxm/search', 'queue' => null, // an optional not required 'defaultSearchMode' => \vxm\searchable\Searchable::FUZZY_SEARCH, 'asYouType' => false, 'fuzziness' => false, 'fuzzyPrefixLength' => 2, 'fuzzyMaxExpansions' => 50, 'fuzzyMaxExpansions' => 50, 'fuzzyDistance' => 50 ] ]
配置模型索引
每个 Active Record 模型都与一个给定的搜索 index
同步,该索引包含该模型的所有可搜索记录。换句话说,您可以将每个索引视为一个 MySQL 表。默认情况下,每个模型都将持久化到与模型典型 table
名称匹配的索引。通常,这是模型名称的复数形式;然而,您可以根据需要通过在 Active Record 模型类上重写 searchableIndex
静态方法来自定义 index
名称。
use vxm\searchable\SearchableBehavior; use vxm\searchable\SearchableTrait; class Article extends ActiveRecord { use SearchableTrait; /** * @inheritDoc */ public function behaviors() { return [ 'searchable' => SearchableBehavior::class ]; } /** * Get the index name for the model class. * * @return string */ public static function searchableIndex(): string { return 'articles_index'; } }
配置可搜索数据
默认情况下,给定模型整个 toArray
形式将被持久化到其搜索索引。如果您希望自定义同步到搜索索引的数据,您可以在模型上重写 toSearchableArray
方法。
use vxm\searchable\SearchableBehavior; use vxm\searchable\SearchableTrait; class Article extends ActiveRecord { use SearchableTrait; /** * @inheritDoc */ public function behaviors() { return [ 'searchable' => SearchableBehavior::class ]; } /** * Get the indexable data array for the model. * * @return array */ public function toSearchableArray(): array { $array = $this->toArray(); // Customize array... return $array; } }
配置可搜索键
默认情况下,模型的唯一 ID 存储在搜索索引中的主键名称。如果您需要自定义此行为,您可以在模型上重写 searchableKey
静态方法。
use vxm\searchable\SearchableBehavior; use vxm\searchable\SearchableTrait; class Article extends ActiveRecord { use SearchableTrait; /** * @inheritDoc */ public function behaviors() { return [ 'searchable' => SearchableBehavior::class ]; } /** * Get searchable key by default primary key will be use. * * @return string key name. */ public static function searchableKey(): string { return 'id'; } }
索引
批量导入
如果您正在将扩展安装到现有项目中,您可能已经有一些数据库记录需要导入到您的搜索驱动器中。此扩展提供了一个导入操作,您可以使用它将所有现有记录导入到搜索索引中。
php yii searchable/import --models="app\models\Post"
您可以通过分隔符 ,
导入多个模型类。
php yii searchable/import --models="app\models\Post, app\models\Category"
添加记录
一旦将 vxm\searchable\SearchableTrait
添加到模型并附加 vxm\searchable\SearchableBehavior
行为,您只需保存模型实例,它将自动添加到您的搜索索引中。如果您已配置队列,此操作将由您的队列工作器在后台执行
$post = new \app\models\Post; // ... $post->save();
通过活动查询结果添加
如果您想将活动查询结果添加到您的搜索索引中,您可以在活动查询结果上使用 makeSearchable
方法。该方法将查询结果分块并添加到您的搜索索引中。再次强调,如果您已配置队列,所有块都将由您的队列工作器在后台添加
// Adding via Active Query result... $models = \app\models\Post::find()->where(['author_id' => 1])->all(); \app\models\Post::makeSearchable($models);
makeSearchable
方法可以视为一个 upsert
操作。换句话说,如果模型记录已在您的索引中,它将被更新。如果它不存在于搜索索引中,它将被添加到索引中。
更新记录
要更新可搜索模型,您只需更新模型实例的属性并将模型保存到您的数据库中。此扩展将自动将更改持久化到您的搜索索引
$post = \app\models\Post::findOne(1); // Update the post... $post->save();
您还可以在活动记录类上使用 makeSearchable
方法来更新实例。如果模型不存在于您的搜索索引中,将创建它们
// Updating via Active Query result... $models = \app\models\Post::find()->where(['author_id' => 1])->all(); \app\models\Post::makeSearchable($models);
删除记录
要从索引中删除记录,请从数据库中删除模型
$post = \app\models\Post::findOne(1); $post->delete();
如果您想从搜索索引中删除活动查询结果,您可以在活动记录类上使用 deleteSearchable
方法
// Deleting via Active Query result... $models = \app\models\Post::find()->where(['author_id' => 1])->all(); \app\models\Post::deleteSearchable($models);
暂停索引
有时您可能需要在模型上执行一系列活动记录操作,而不将模型数据同步到您的搜索索引。您可以使用 withoutSyncingToSearch
方法来完成此操作。此方法接受一个回调,该回调将被立即执行。在回调中发生的任何模型操作都不会同步到模型的索引
\app\models\Post::withoutSyncingToSearch(function () { $post = \app\models\Post::findOne(1); $post->save(); // will not syncing with index data });
条件性可搜索模型实例
有时您可能需要在某些条件下仅使模型可搜索。例如,假设您有一个 app\models\Article
模型,它可能处于两种状态之一:draft
和 published
。您可能只想允许 published
帖子可搜索。为此,您可以在模型上定义一个 shouldBeSearchable
方法
use vxm\searchable\SearchableBehavior; use vxm\searchable\SearchableTrait; class Article extends ActiveRecord { use SearchableTrait; /** * @inheritDoc */ public function behaviors() { return [ 'searchable' => SearchableBehavior::class ]; } /** * Determine if the model should be searchable. * * @return bool */ public static function shouldBeSearchable() { return $this->is_published; } }
shouldBeSearchable
方法仅在通过保存方法操作模型时应用。直接使用 searchable
或 makeSearchable
方法将覆盖 shouldBeSearchable
方法的结果
// Will respect "shouldBeSearchable"... $post = \app\models\Post::findOne(1); $post->save(); // Will override "shouldBeSearchable"... $post->searchable(); $models = \app\models\Post::find()->where(['author_id' => 1])->all(); \app\models\Post::makeSearchable($models);
搜索
简单
您可以使用 search
方法开始搜索模型。该方法接受一个字符串,该字符串将用于搜索您的模型。此方法返回一个 ActiveQuery
,您可以在其中添加更多条件或关系,就像原始查询一样。
注意,当添加更多查询条件时,您必须不使用
where
方法,而是使用andWhere
或orWhere
,因为它将覆盖搜索 id 条件的结果。
$posts = \app\models\Post::search('vxm')->all(); $posts = \app\models\Post::search('vxm')->andWhere(['author_id' => 1])->all(); // not use $posts = \app\models\Post::search('vxm')->where(['author_id' => 1])->all();
高级
您可以在支持 searchable
的关系上使用搜索查询进行连接关系
$posts = \app\models\Post::search('vxm')->joinWith('category')->andWhere(Category::search('vxm category'));
搜索模式
如果您未设置 Searchable
组件的 defaultSearchMode
,则可以选择 boolean
或 fuzzy
搜索模式作为第二个参数
$posts = \app\models\Post::search('vxm', 'fuzzy', ['fuzziness' => true])->all(); $posts = \app\models\Post::search('vxm', 'boolean')->all();
有关搜索模式的更多详细信息,请参阅 teamtnt/tntsearch 以查看完整文档。