Paket ini menyediakan driver Laravel Scout generik yang melakukan pencarian teks lengkap pada data model yang diindeks menggunakan database SQL sebagai backend penyimpanan. Data yang diindeks disimpan dalam bentuk yang dinormalisasi, memungkinkan pencarian yang efisien dan fuzzy yang tidak memerlukan kecocokan penuh dan/atau tepat.
Pengemudi ini merupakan alternatif untuk teamtnt/laravel-scout-tntsearch-driver . Perbedaan utama adalah bahwa driver ini menyediakan lebih sedikit fitur (seperti Pencarian Geo). Sebaliknya, ia bekerja dengan semua sistem basis data yang didukung oleh Laravel itu sendiri (yang pada dasarnya adalah semua driver PDO). Juga, algoritma pencarian sedikit berbeda.
Semua tes dijalankan melalui tindakan GitHub untuk PHP 8.0, 8.1 dan 8.2 pada sistem database berikut:
Keterbatasan aktual mengenai sistem basis data yang didukung sebagian besar terkait dengan penggunaan ekspresi meja umum menggunakan Staudenmeir/Laravel-CTE. Pastikan sistem database Anda didukung sebelum menggunakan paket, atau Anda mungkin mengalami kesalahan database.
Anda dapat menginstal paket melalui komposer:
composer require namoshek/laravel-scout-databaseSetelah menginstal paket, file konfigurasi serta migrasi perlu dipublikasikan:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations " Jika Anda ingin menggunakan awalan tabel yang berbeda dari scout_ untuk tabel yang dibuat oleh paket ini, Anda harus mengubah konfigurasi serta migrasi yang disalin sesuai. Ketika Anda telah melakukannya, Anda kemudian dapat menerapkan migrasi basis data:
php artisan migratev0.x ke v1.x Dengan versi baru, skema database telah berubah dan migrasi baru perlu dipublikasikan menggunakan:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "Petunjuk yang sama seperti yang disebutkan di atas di bagian instalasi juga berlaku untuk migrasi yang baru diterbitkan.
Konfigurasi telah sedikit berkurang dan Anda mungkin ingin membandingkan file konfigurasi baru dengan yang lama untuk menghapus pengaturan usang. Melewati bagian ini tidak memiliki dampak negatif pada kinerja pengemudi Scout.
NamoshekScoutDatabaseCommandsCleanWordsTable::class command telah dihapus dan Anda harus tidak dijadwalkan, jika Anda menambahkannya sebelumnya.
Sebagian besar kemunculan bidang dan metode protected telah diubah menjadi private untuk menyederhanakan pengembangan sehubungan dengan perubahan kompatibilitas ke belakang di masa depan. Jika Anda belum secara aktif mengesampingkan bagian -bagian implementasi, ini tidak memengaruhi Anda sama sekali.
Untuk menginstruksikan Scout untuk menggunakan driver yang disediakan oleh paket ini, Anda perlu mengubah opsi driver di config/scout.php ke database . Jika Anda tidak mengubah file konfigurasi Scout, Anda juga dapat mengatur variabel lingkungan SCOUT_DRIVER ke database sebagai gantinya.
Semua opsi konfigurasi yang tersedia dari paket itu sendiri dapat ditemukan di config/scout-database.php . Opsi dijelaskan secara menyeluruh dalam file itu sendiri. Secara default, paket menggunakan UnicodeTokenizer dan PorterStemmer yang cocok untuk bahasa Inggris. Pencarian menambahkan wildcard trailing ke token terakhir dan tidak semua istilah pencarian perlu ditemukan agar dokumen muncul dalam hasil (harus ada setidaknya satu pertandingan).
Anda juga dapat menambahkan wildcard ke setiap token pencarian dengan mengaktifkan wildcard_all_tokens dalam file konfigurasi meskipun ini tidak disarankan untuk alasan kinerja.
Instalasi dasar yang paling mungkin tidak mengharuskan Anda untuk mengubah pengaturan ini. Hanya untuk memastikan, Anda harus melihat opsi connection . Jika Anda ingin mengubah ini, lakukan sebelum menjalankan migrasi atau tabel akan dibuat menggunakan koneksi database yang salah.
Saat ini, hanya UnicodeTokenizer yang tersedia. Ini akan membagi string pada karakter apa pun yang bukan huruf, atau angka sesuai dengan p{L} dan p{N} pola regex. Ini berarti bahwa titik -titik, titik dua, tanda hubung, spasi putih, dll. Adalah kriteria terpisah.
Jika Anda memiliki persyaratan yang berbeda untuk tokenizer, Anda dapat memberikan implementasi Anda sendiri melalui konfigurasi. Pastikan itu mengimplementasikan antarmuka Tokenizer .
Saat ini, semua stemmers yang diterapkan oleh paket wamania/php-stemmer tersedia. Kelas pembungkus telah ditambahkan untuk masing -masing:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (dapat digunakan untuk menonaktifkan batang)PorterStemmer (default, sama seperti EnglishStemmer )PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer Jika Anda memiliki persyaratan yang berbeda untuk stemmer, Anda dapat memberikan implementasi Anda sendiri melalui konfigurasi. Pastikan itu mengimplementasikan antarmuka Stemmer .
Paket ini mengikuti kasus penggunaan yang tersedia yang dijelaskan dalam dokumentasi Scout resmi. Harap perhatikan batasan yang terdaftar.
Driver pencarian secara internal menggunakan tabel tunggal, yang berisi istilah dan asosiasi untuk dokumen. Saat mengindeks dokumen (yaitu menambahkan atau memperbarui model dalam indeks pencarian) mesin akan menggunakan tokenizer yang dikonfigurasi untuk membagi input setiap kolom menjadi token. Tokenizer yang dikonfigurasi secara default hanya membagi input menjadi kata -kata yang terdiri dari huruf atau nomor unicode apa pun, yang berarti karakter lain seperti , . , - , _ , ! , ? , / , whitespace dan semua karakter khusus lainnya dianggap pemisah untuk token dan akan dihapus oleh tokenizer. Dengan cara ini karakter seperti itu tidak akan pernah berakhir di indeks pencarian itu sendiri.
Setelah input telah menjadi tokenisasi, masing -masing token (dan pada titik ini kami benar -benar mengharapkan token kami menjadi kata -kata) dijalankan melalui stemmer yang dikonfigurasi untuk mengambil batang (yaitu kata root ). Melakukan tindakan ini memungkinkan kita untuk mencari kata -kata serupa nanti. PorterStemmer misalnya akan menghasilkan intellig sebagai output untuk input intelligent maupun intelligence sebagai input. Bagaimana ini membantu saat mencari akan jelas sebentar lagi.
Akhirnya, hasil proses ini disimpan dalam database. Tabel indeks diisi dengan hasil proses batang dan asosiasi dengan model yang diindeks (tipe model dan pengidentifikasi). Selain itu, untuk setiap baris dalam indeks, database juga berisi jumlah kejadian dalam dokumen. Kami menggunakan informasi ini untuk mencetak di bagian pencarian mesin kami.
Saat menjalankan kueri pencarian, proses tokenisasi dan batang yang sama seperti yang digunakan untuk pengindeksan diterapkan pada string kueri pencarian. Hasil dari proses ini adalah daftar batang (atau kata -kata root ) yang kemudian digunakan untuk melakukan pencarian yang sebenarnya. Bergantung pada konfigurasi paket, pencarian akan mengembalikan dokumen yang berisi setidaknya satu atau semua batang. Ini dilakukan dengan menghitung skor untuk setiap pertandingan dalam indeks berdasarkan frekuensi dokumen terbalik (yaitu rasio antara dokumen yang diindeks dan dokumen yang berisi salah satu kata yang dicari), istilah frekuensi (yaitu jumlah kejadian dari istilah pencarian dalam dokumen) dan istilah penyimpangan (yang hanya relevan untuk pencarian wildcard). Kembali adalah dokumen yang dipesan oleh skor mereka dalam urutan menurun, sampai batas yang diinginkan tercapai.
Dimungkinkan untuk memperluas tabel indeks pencarian ( scout_index ) dengan kolom khusus. Selama pengindeksan, kolom -kolom ini dapat diisi dengan konten khusus dan selama pencarian pencarian dapat dilingkupi kolom -kolom ini (kecocokan yang tepat). Fitur ini sangat berguna ketika bekerja dengan aplikasi multi-tenancy di mana indeks pencarian digunakan oleh beberapa penyewa.
Dalam contoh kami, kami menambahkan kolom tenant_id wajib ke indeks pencarian.
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
}; tenant_id ditambahkan selama pengindeksan untuk setiap model:
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
} tenant_id disaring selama pencarian berdasarkan $tenantId , yang dapat diambil dari permintaan HTTP:
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();Jelas, paket ini tidak menyediakan mesin pencari yang (bahkan dari jarak jauh) membawa kinerja dan kualitas mesin pencari profesional seperti penawaran Elasticsearch. Solusi ini dimaksudkan untuk proyek yang lebih kecil hingga menengah yang membutuhkan solusi yang agak sederhana.
Juga patut dicatat, fitur -fitur pengintai berikut saat ini tidak diimplementasikan:
User::search('Mustermann')->within('users_without_admins')User::search('Musterfrau')->orderBy('age', 'desc')Salah satu masalah dengan mesin pencari ini adalah bahwa hal itu dapat menyebabkan masalah jika beberapa pekerja antrian bekerja pada pengindeksan satu dokumen secara bersamaan (database akan menemui jalan buntu). Untuk menghindari masalah ini, jumlah upaya yang digunakan untuk transaksi dapat dikonfigurasi. Secara default, setiap transaksi dicoba maksimal tiga kali jika kebuntuan (atau kesalahan lainnya) terjadi.
Lisensi MIT (MIT). Silakan lihat file lisensi untuk informasi lebih lanjut.