擴展程序提供了簡單的全文搜索,並從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以查看完整文檔。