Merhaba,


Bu yazıda Laravel'de MySQL veritabanının bir özelliği olan Full Text Search kullanımından bahsedeceğim. Örnek projeyi Github üzerinden paylaştım. İndirip inceleyebilirsiniz.


Örnek Proje Linki


İlk olarak komut satırında masaüstü dizinine gelerek aşağıdaki komutu yazıp yeni bir Laravel projesi oluşturuyorum:

composer create-project --prefer-dist laravel/laravel full-text-search-sample


Sonrasında Xampp yardımıyla yerelde bir veritabanı oluşturuyorum. Proje kök dizinindeki .env dosyasını açarak veritabanı bilgilerini aşağıdaki gibi düzenliyorum:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=fts_db
DB_USERNAME=root
DB_PASSWORD=


defaultStringLength hatasıyla karşılaşmamak için app/Providers/AppServiceProvider.php dosyasını açarak boot() fonksiyonunu düzenliyorum:

public function boot()
{
    Schema::defaultStringLength(191);
}


database/migrations klasörünün içinde users tablosu için otomatik olarak oluşturulan migration dosyasını açıyorum. 'address' adında bir sütun ekleyerek bu sütunu fulltext olarak indeksliyorum:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->string('address');
        $table->rememberToken();
        $table->timestamps();
    });

    DB::statement('ALTER TABLE users ADD FULLTEXT fulltext_index (address)');
}


Şu komutu çalıştırarak veritabanı tablosunun oluşturulmasını sağlıyorum:

php artisan migrate


users tablosunda fake veriler oluşturmak adına seed işlemi yapmam gerekiyor. Bunun için öncelikle bir seeder oluşturuyorum:

php artisan make:seeder UsersTableSeeder


Oluşturduğum seeder'ı database/seeds klasörünün içinde yer alan DatabaseSeeder dosyasının run metoduna ekliyorum:

public function run()
{
    $this->call(UsersTableSeeder::class);
}


Ve şu komutu çalıştırarak users tablosunda fake veriler elde etme işlemini tamamlıyorum:

php artisan db:seed


users tablosunun bir kısmı:


FullTextSearch adında bir trait dosyası oluşturup içeriğini şu şekilde dolduruyorum:

<?php

namespace App;

trait FullTextSearch
{
    public function scopeSearch($query, $term)
    {
        $query->whereRaw("MATCH (address) AGAINST (? IN BOOLEAN MODE)" , $term);
        return $query;
    }
}


User model dosyasına gerekli eklemeleri yapıyorum:

use FullTextSearch;

protected $searchable = ['address'];


İşlemi test etmek adına routes/api.php dosyasında bir adet route tanımlıyorum:

Route::post('search', 'UserController@search');


Kullanmak istediğim controller dosyasını oluşturuyorum:

php artisan make:controller UserController


Ve controller dosyamın içeriğini şu şekilde dolduruyorum:

<?php

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
    public function search()
    {
        $text = request()->text;
        $users = User::search($text)->get();
        return $users;
    }
}


Artık işlemi test edebilirim:

php artisan serve


Postman üzerinden yapılan istek:


Elde edilen sonuç:


İyi çalışmalar.