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 providers
tambahkan 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=tntsearch
Konfigurasi 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