拡張機能は、Yii2 Active RecordのTeamTNT/TNTSearchラッパーに基づいて、Laravel/ScoutとBaseのアイデアを備えたシンプルなフルテキスト検索を提供します。
Composerを使用して検索可能なYii2が必要です。
composer require vxm/yii2-searchable最後に、 vxmsearchableSearchableTrait特性を追加し、 vxmsearchableSearchableBehavior behaviorの動作を、検索可能にしたいアクティブなレコードに添付します。これは、モデルをインデックスデータと同期するのに役立ちます。
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 ' => ' 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モデルクラスの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 "vxmsearchableSearchableTraitを追加し、 vxmsearchableSearchableBehavior Behaviorの動作をモデルに添付したら、モデルインスタンスを保存するだけで、検索インデックスに自動的に追加されます。キューを構成している場合、この操作は、キューワーカーによってバックグラウンドで実行されます。
$ 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 2つの州のいずれかにあります。 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方法を使用してモデルの検索を開始できます。検索方法は、モデルの検索に使用される単一の文字列を受け入れます。このメソッドは、Originクエリのような条件や関係を追加できるActiveQueryを返します。
注クエリ条件を追加するときは、検索IDの条件の結果をオーバーライドするため、メソッドが使用している
whereandWhere、代わりに使用するorWhereは使用しないでください。
$ 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 ();Relations Support searchableを使用して、検索クエリの関係に参加できます。
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' ));SearchableコンポーネントのdefaultSearchModeを設定しない場合、 booleanまたはfuzzy検索モードを2番目のパラメーターとして選択できます。
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();検索モードの詳細については、完全なドキュメントを表示するには、teamtnt/tntsearchを参照してください。