Sep 11, 2016

Membangun Fitur Pencarian dengan Laravel Scout

Laravel versi 5.3 telah memiliki fitur pencarian full-text via package Scout. Implementasinya sangat mudah karena Scout sudah terintegrasi dengan Eloquent ORM. Hingga artikel ini ditulis, Scout sudah mendukung search engine Algolia dan Elasticsearch. Tapi tidak menutup kemungkinan ke depannya akan ditambahkan lagi search engine yang lain untuk memenuhi kebutuhan penggunanya.

Cara Pemasangan Scout

Sebelumnya pastikan kamu telah membuat sebuah projek Laravel versi 5.3, lalu buka file composer.json pada editor kamu. Tambahkan dependency untuk Scout seperti ini:

"require": {
        "php"              : ">=5.6.4",
        "laravel/framework": "5.3.*",
        "laravel/scout": "1.1.*",
		...
}

Jalankan composer update pada terminal untuk menginstal Scout pada projek Laravel kamu (note: butuh koneksi internet). Setelah proses instalasi selesai, jalankan php artisan vendor:publish untuk menghasilkan file konfigurasi untuk Scout. Selanjutnya, buka file config/app.php lalu tambahkan Laravel\Scout\ScoutServiceProvider::class pada bagian providers.

Menggunakan Scout pada Model

Pada dasarnya, penggunaan Scout terdiri dari dua langkah, yaitu mengimpor kelas trait Laravel\Scout\Searchable dan menggunakan trait tersebut pada model yang telah kamu buat. Contoh penggunaannya dapat dilihat pada kode di bawah ini:

<?php

namespace App;

use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;

class Modelku extends Model
{
	use Searchable;
}

Melakukan Pencarian

Untuk melakukan pencarian, kamu bisa menambahkan kode di bawah ini di suatu method di controller:

$result = <Nama Namespace>\<Nama Model>::search('<kueri pencarian>')->get();

Variabel $result akan menyimpan kumpulan model Eloquent dalam bentuk array dan dapat dimanfaatkan dengan mengirimkan variabel tersebut lewat fungsi view().

Integrasi dengan Elasticsearch

Sampai pada tahap ini Scout kamu belum bisa digunakan karena kamu belum mengatur search engine-nya. Di antara dua pilihan search engine yang di dukung oleh Scout, yang dapat diinstal di lokal dan gratis adalah Elasticsearch. Untuk instalasinya kamu perlu menginstal Java-JRE terlebih dahulu. Setelah itu unduh Elasticsearch-nya disini. Bagi yang menggunakan OS Debian/Ubuntu, pilih versi deb. Setelah file selesai terunduh, instal dengan menjalankan perintah sudo dpkg -i <nama-file-elasticsearch.deb>. Untuk mengecek apakah Elasticsearch telah terinstal dan berjalan dengan baik, jalankan perintah curl -X GET http://localhost:9200.

Cara instalasi Elasticsearch pada OS Windows kedepannya akan ditambahkan di artikel ini.

Untuk berkomunikasi dengan Elasticsearch dengan php kita perlu menginstal librari elasticsearch-php dengan menjalankan perintah composer install elasticsearch\elasticsearch-php.

Setelah semuanya terinstal, buka file config/scout.php, ganti driver dengan nilai ‘elasticsearch’ dan isi host pada konfigurasi bagian Elasticsearch dengan ‘http://localhost:9200’. Hasil konfigurasinya kurang lebih akan seperti di bawah ini:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Search Engine
    |--------------------------------------------------------------------------
    |
    | This option controls the default search connection that gets used while
    | using Laravel Scout. This connection is used when syncing all models
    | to the search service. You should adjust this based on your needs.
    |
    | Supported: "algolia", "null"
    |
    */

    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
	
	...
	...
	
    'elasticsearch' => [
        'index' => env('ELASTICSEARCH_INDEX', 'laravel'),

        'config' => [
            'hosts' => [
                env('ELASTICSEARCH_HOST', 'http://localhost:9200')
            ],
        ],
    ],

];

Kamu mungkin akan perlu melakukan indexing apabila model kamu telah memiliki record di database. Caranya adalah dengan menjalankan perintah php artisan scout:import "<Nama Namespace>\<Nama Model>".

Testing

Jalankan php artisan tinker di terminal. Pada shell yang muncul, ketik <Nama Namespace>\<Nama Model>::search('<kata kunci pencarian>')->get() lalu tekan <enter>.

Contoh kasus: Kamu punya model App\Models\Makanan. Pada database telah tersimpan record Makanan dengan nama ‘Kentang Goreng’, ‘Kentang Rebus’ dan ‘Kentang Bakar’. Dengan menjalankan perintah App\Models\Makanan::search('kentang')->get() pada shell, kamu akan mendapatkan tiga record tersebut yang relevan dengan kata kunci ‘kentang’.

Penutup

Dengan Scout, kita dapat dengan mudah membangun fitur pencarian pada projek Laravel. Untuk lebih jelasnya kamu dapat mempelajari penerapan Scout pada source code ini. Selamat belajar~