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=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