扩展程序提供了简单的全文搜索,并从Laravel/Scout和Teamtnt/TNTSearch包装器上获得的想法获得了YII2主动记录的基础。
需要使用Composer搜索YII2:
composer require vxm/yii2-searchable最后,将vxmsearchableSearchableTrait性状添加,然后将vxmsearchableSearchableBehavior行为附加到您想要搜索的活动记录中。这将有助于将模型与索引数据同步。
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}虽然并非严格要求使用此扩展名,但您应该在使用扩展名之前强烈考虑配置YII2-quesue。运行队列工人将允许其排队所有将您的模型信息同步到搜索索引的操作,从而为您的应用程序的Web界面提供了更好的响应时间。
配置了队列组件后,将应用程序配置文件中的队列选项的值设置为IT的组件ID或IT的数组配置。
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
]默认情况下,组件将通过带有ID searchable引导程序添加到您的应用程序组件中。如果需要配置,则可以在应用程序配置文件中手动配置:
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' 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
]
]每个活动的记录模型都与给定的搜索index同步,其中包含该模型的所有可搜索记录。换句话说,您可以将每个索引视为MySQL表。默认情况下,每个模型都将持续到与模型的典型table名称相匹配的索引。通常,这是模型名称的复数形式。但是,您可以通过覆盖Active Record Model类上的searchableIndex static方法来自定义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 "将vxmsearchableSearchableTrait添加并将vxmsearchableSearchableBehavior行为附加到模型中后,您需要做的就是保存模型实例,并将其自动添加到您的搜索索引中。如果您配置了队列,则该操作将由您的队列工人在后台执行:
$ post = new app models Post ;
// ...
$ post -> save ();如果您想在搜索索引中添加活动查询结果,则可以在活动查询结果中使用makeSearchable方法。 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
});有时,您可能只需要在某些条件下搜索模型。例如,想象一下,您拥有可能在两个状态之一中的appmodelsArticle模型: 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 ,您可以添加更多条件或关系,例如Origin查询。
请注意,当添加更多查询条件时,您不得
where方法使用andWhere或orWhere使用,因为它会覆盖搜索IDS条件结果。
$ 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以查看完整文档。