Laravel 5.3 Menggunakan Full Text Search Dengan Scout & Tntsearch
Seringkali saat mencoba mencari suatu data dari tabel di database saya cukup sering kebingungan menetukan kolom pencarian, misal apakah dicari berdasarkan “judul” atau “deskripsi”, atau keduanya. Sekarang gak perlu pusing, sudah ada paket tambahan untuk keperluan seperti itu. Saya di sini menggunakan paket laravel/scout dan teamtnt/laravel-scout-tntsearch-driver. Jadi langsung sajalah.
Pertama, pasang paket yang dibutuhkan.
Buka composer.json lalu tambahkan dua paket tersebut di bagian require sehingga seperti ini
"require": {
"php": ">=5.6.4",
"laravel/framework": "5.3.*",
"laravel/scout": "^2.0",
"teamtnt/laravel-scout-tntsearch-driver": "^2.0"
},
Lalu ketikan perintah composer update untuk memasang paket tersebut, tunggu sampai selesai.
Konfigurasi.
Setelah berhasil dipasang buka berkas config/app.php lalu pada bagian providerstambahkan baris berikut :
'providers' => [
/*
* Package Service Providers...
*/
Laravel\Scout\ScoutServiceProvider::class,
TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
]
Lalu konfigurasi scout harap di-publish
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Setelah itu buka berkas config/scout.php lalu tambahkan baris berikut
'tntsearch' => [
'storage' => storage_path(),
],
Script di atas maksudnya sebagai media penyimpanan index yang akan dibaut nantinya, saya memilih storage_path() laravel saja biar cepat.
Terakhir tambahkan parameter baru di .env yaitu
SCOUT_DRIVER=tntsearchKonfigurasi selesai.
Pembuatan Model
Sebelumnya pastikan aplikasi sudah tersambung ke database, dan karena saya malas membuat banyak data akhirnya saya pake dummy data yang disediakan dari situs Mysql, sialhkan pilih salah satu saya memilih sakila database yang merupakan dummy data untuk sistem bioskop.
Buat satu model Film dengan perintah
php artisan make:model Film
Untuk isi modelnya sendiri saya seperti ini.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Film extends Model
{
use Searchable;
protected $table = "film";
protected $primaryKey = "film_id";
public function searchableAs()
{
return 'film_index';
}
}
Penjelasan singkat :
Menambahkan trait baru yaitu Searchable dan fungsi searchableAs() merupakan fungsi utnuk memberi nama index yang akan dibuat dan disimpan di storage_path() yang tadi dikonfigurasi.
Setelah selesai lalu hal terakhir yang dilakukan adalah buat index pencarian dari model ini. Caranya gunakan perintah ini
php artisan scout:import "App\Film"
Tunggu sampai selesai dan berkas index akan muncul di folder storage. Oh iya tenang saja setipa proses crud yang dilakukan gak perlu buat index baru, udah otomatis.
Percobaan
Tanpa perlu membuat controller saya langsung eksekusi saja di routes/web.php
Yang pertama query biasa menggunakan where
<?php
Route::get('/', function () {
# return view('welcome');
$result = \App\Film::where("title","like","%alien egg%")->orWhere("description","like","%alien egg%")->get();
dd($result);
});
Maka menghasilkan
Collection {#167 ▼
#items: []
}
Lalu jika menggunkan metode search() dari laravel scout
<?php
Route::get('/', function () {
# return view('welcome');
$result = \App\Film::search("alien egg")->get();
dd($result);
});
Hasilnya
Collection {#177 ▼
#items: array:6 [▼
0 => Film {#195 ▼
#table: "film"
#primaryKey: "film_id"
#connection: null
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:13 [▼
"film_id" => 274
"title" => "EGG IGBY"
"description" => "A Beautiful Documentary of a Boat And a Sumo Wrestler who must Succumb a Database Administrator in The First Manned Space Station"
"release_year" => 2006
"language_id" => 1
"original_language_id" => null
"rental_duration" => 4
"rental_rate" => "2.99"
"length" => 67
"replacement_cost" => "20.99"
"rating" => "PG"
"special_features" => "Commentaries,Behind the Scenes"
"last_update" => "2006-02-15 05:03:42"
]
#original: array:13 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
+exists: true
+wasRecentlyCreated: false
}
1 => Film {#197 ▶}
2 => Film {#192 ▶}
3 => Film {#196 ▶}
4 => Film {#194 ▼
#table: "film"
#primaryKey: "film_id"
#connection: null
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:13 [▼
"film_id" => 223
"title" => "DESIRE ALIEN"
"description" => "A Fast-Paced Tale of a Dog And a Forensic Psychologist who must Meet a Astronaut in The First Manned Space Station"
"release_year" => 2006
"language_id" => 1
"original_language_id" => null
"rental_duration" => 7
"rental_rate" => "2.99"
"length" => 76
"replacement_cost" => "24.99"
"rating" => "NC-17"
"special_features" => "Deleted Scenes"
"last_update" => "2006-02-15 05:03:42"
]
#original: array:13 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
+exists: true
+wasRecentlyCreated: false
}
5 => Film {#193 ▶}
]
}
Nah terlihatkan perbedaannya ?
Referensi : https://laravel-news.com/tntsearch-with-laravel-scout