Ekstensi memberikan pencarian teks lengkap sederhana dengan ide-ide yang didapat dari Laravel/Scout dan base pada pembungkus TeamTnt/TNTSEARCH untuk catatan aktif Yii2.
Membutuhkan Yii2 yang dapat dicari menggunakan komposer:
composer require vxm/yii2-searchable Akhirnya, tambahkan vxmsearchableSearchableTrait ciri dan lampirkan vxmsearchableSearchableBehavior ke catatan aktif yang ingin Anda dapat dicari. Ini akan membantu menyinkronkan model dengan data indeks.
use vxm searchable SearchableBehavior ;
use vxm searchable SearchableTrait ;
class Article extends ActiveRecord
{
use SearchableTrait;
/**
* @inheritDoc
*/
public function behaviors ()
{
return [
' searchable ' => SearchableBehavior::class
];
}
}Meskipun tidak secara ketat diminta untuk menggunakan ekstensi ini, Anda harus sangat mempertimbangkan untuk mengkonfigurasi YII2-Queue sebelum menggunakan ekstensi. Menjalankan pekerja antrian akan mengizinkannya untuk mengantri semua operasi yang menyinkronkan informasi model Anda ke indeks pencarian Anda, memberikan waktu respons yang jauh lebih baik untuk antarmuka web aplikasi Anda.
Setelah Anda mengkonfigurasi komponen antrian, atur nilai opsi antrian dalam file konfigurasi aplikasi Anda ke ID komponen atau konfigurasi array.
' components ' => [
' searchable ' => [
' class ' => ' vxmsearchableSearchable ' ,
' queue ' => ' queueComponentId '
]
] Secara default komponen akan ditambahkan ke komponen aplikasi Anda melalui bootstrap dengan ID searchable . Jika Anda perlu mengonfigurasinya, Anda dapat mengonfigurasi file konfigurasi aplikasi Anda:
' 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
]
] Setiap model catatan aktif disinkronkan dengan index pencarian yang diberikan, yang berisi semua catatan yang dapat dicari untuk model itu. Dengan kata lain, Anda dapat memikirkan setiap indeks seperti tabel MySQL. Secara default, setiap model akan bertahan dengan indeks yang cocok dengan nama table khas model. Biasanya, ini adalah bentuk jamak dari nama model; Namun, Anda bebas untuk menyesuaikan nama index dengan menimpa metode statis searchableIndex pada kelas model rekaman aktif:
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 ' ;
}
} Secara default, seluruh bentuk toArray dari model yang diberikan akan bertahan pada indeks pencariannya. Jika Anda ingin menyesuaikan data yang disinkronkan ke indeks pencarian, Anda dapat mengganti metode toSearchableArray pada model:
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 ;
}
} Secara default, nama kunci utama model sebagai ID unik yang disimpan dalam indeks pencarian. Jika Anda perlu menyesuaikan perilaku ini, Anda dapat mengganti metode statis searchableKey pada model:
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 ' ;
}
}Jika Anda memasang ekstensi ke proyek yang ada, Anda mungkin sudah memiliki catatan database, Anda perlu diimpor ke driver pencarian Anda. Ekstensi ini memberikan tindakan impor yang dapat Anda gunakan untuk mengimpor semua catatan yang ada ke dalam indeks pencarian Anda:
php yii searchable/import -- models ="app models Post " Anda dapat mengimpor kelas multi model oleh pemisah , :
php yii searchable/import -- models ="app models Post , app models Category " Setelah Anda menambahkan vxmsearchableSearchableTrait dan melampirkan perilaku perilaku vxmsearchableSearchableBehavior ke model, yang perlu Anda lakukan adalah menyimpan contoh model dan secara otomatis akan ditambahkan ke indeks pencarian Anda. Jika Anda telah mengonfigurasi antrian, operasi ini akan dilakukan di latar belakang oleh pekerja antrian Anda:
$ post = new app models Post ;
// ...
$ post -> save (); Jika Anda ingin menambahkan hasil kueri aktif ke indeks pencarian Anda, Anda dapat menggunakan metode makeSearchable ke hasil kueri aktif. Metode makeSearchable akan memotong hasil kueri dan menambahkan catatan ke indeks pencarian Anda. Sekali lagi, jika Anda telah mengkonfigurasi antrian, semua potongan akan ditambahkan di latar belakang oleh pekerja antrian Anda:
// Adding via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models ); Metode makeSearchable dapat dianggap sebagai operasi upsert . Dengan kata lain, jika catatan model sudah ada dalam indeks Anda, itu akan diperbarui. Jika tidak ada dalam indeks pencarian, itu akan ditambahkan ke indeks.
Untuk memperbarui model yang dapat dicari, Anda hanya perlu memperbarui properti instance model dan menyimpan model ke database Anda. Ekstensi ini akan secara otomatis bertahan perubahan pada indeks pencarian Anda:
$ post = app models Post:: findOne ( 1 );
// Update the post...
$ post -> save (); Anda juga dapat menggunakan metode makeSearchable pada kelas rekaman aktif untuk memperbarui instance. Jika model tidak ada dalam indeks pencarian Anda, mereka akan dibuat:
// Updating via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: makeSearchable ( $ models );Untuk menghapus catatan dari indeks Anda, hapus model dari database:
$ post = app models Post:: findOne ( 1 );
$ post -> delete (); Jika Anda ingin menghapus hasil kueri aktif dari indeks pencarian Anda, Anda dapat menggunakan metode deleteSearchable pada kelas rekaman aktif:
// Deleting via Active Query result...
$ models = app models Post:: find ()-> where ([ ' author_id ' => 1 ])-> all ();
app models Post:: deleteSearchable ( $ models ); Terkadang Anda mungkin perlu melakukan batch operasi catatan aktif pada model tanpa menyinkronkan data model ke indeks pencarian Anda. Anda dapat melakukan ini dengan menggunakan metode withoutSyncingToSearch . Metode ini menerima panggilan balik tunggal yang akan segera dieksekusi. Operasi model apa pun yang terjadi dalam panggilan balik tidak akan disinkronkan ke indeks model:
app models Post:: withoutSyncingToSearch ( function () {
$ post = app models Post:: findOne ( 1 );
$ post -> save (); // will not syncing with index data
}); Terkadang Anda mungkin hanya perlu membuat model yang dapat dicari dalam kondisi tertentu. Misalnya, bayangkan Anda memiliki appmodelsArticle yang mungkin ada di salah satu dari dua negara bagian: draft dan published . Anda mungkin hanya ingin mengizinkan posting published dapat dicari. Untuk mencapai ini, Anda dapat mendefinisikan metode shouldBeSearchable pada model Anda:
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 ;
}
} Metode shouldBeSearchable hanya diterapkan saat memanipulasi model melalui metode Simpan. Langsung membuat model menggunakan metode searchable atau makeSearchable akan mengganti hasil metode 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 ); Anda dapat mulai mencari model menggunakan metode search . Metode pencarian menerima satu string yang akan digunakan untuk mencari model Anda. Metode ini mengembalikan ActiveQuery Anda dapat menambahkan lebih banyak kondisi atau hubungan seperti kueri asal.
CATATAN Saat menambahkan lebih banyak kondisi kueri, Anda tidak boleh menggunakan
wheremetode penggunaanandWheredi mana atauorWheremana karena itu akan mengganti hasil kondisi ID pencarian.
$ 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 (); Anda dapat bergabung dengan hubungan pada permintaan pencarian dengan dukungan hubungan searchable :
$ posts = app models Post:: search ( ' vxm ' )-> joinWith ( ' category ' )-> andWhere (Category:: search ( ' vxm category ' )); Anda dapat memilih mode pencarian boolean atau fuzzy sebagai parameter kedua jika tidak mengatur defaultSearchMode komponen Searchable akan digunakan:
$ posts = app models Post:: search ( ' vxm ' , ' fuzzy ' , [ ' fuzziness ' => true ])-> all ();
$ posts = app models Post:: search ( ' vxm ' , ' boolean ' )-> all ();Untuk detail lebih lanjut dari mode pencarian, silakan merujuk ke TeamTnt/Tntsearch untuk melihat dokumen lengkap.