· Admin

Laravel + Meilisearch ile Süper Hızlı Arama Motoru

Arama artık bir "ekstra" değil, kullanıcı deneyiminin merkezinde. Elasticsearch güçlü ama ağır — kurulum, bakım ve kaynak tüketimi her proje için uygun değil. Meilisearch ise açık kaynak yapısı, yüksek performansı ve kolay kurulumu ile güçlü bir alternatif.

Meilisearch Nedir?

Açık kaynaklı, modern ve son derece hızlı bir full-text search engine:

  • Milisaniyeler içinde arama sonuçları
  • Typo tolerance (yazım hatalarına tolerans)
  • Relevance odaklı sıralama
  • Basit REST API
  • Çok dilli arama desteği
  • Düşük kaynak tüketimi

Meilisearch vs Elasticsearch

Özellik Meilisearch Elasticsearch
Kurulum Çok kolay Karmaşık
Kaynak tüketimi Düşük Yüksek
Öğrenme eğrisi Düşük Yüksek
Laravel entegrasyonu Çok kolay Orta
Küçük/orta projeler Çok uygun Gereksiz ağır
Büyük veri analizi Sınırlı Çok güçlü

Blog, e-ticaret, SaaS projeleri için Meilisearch genellikle daha mantıklı.

Kurulum

1. Meilisearch (Docker)

docker run -it --rm \
  -p 7700:7700 \
  -e MEILI_MASTER_KEY=masterKey \
  getmeili/meilisearch

2. Laravel Scout

composer require laravel/scout
composer require meilisearch/meilisearch-php
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

3. .env Ayarları

SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=masterKey

Model Entegrasyonu

use Laravel\Scout\Searchable;

class Post extends Model
{
    use Searchable;

    protected $fillable = ['title', 'content', 'language'];

    public function toSearchableArray(): array
    {
        return [
            'title'    => $this->title,
            'content'  => $this->content,
            'language' => $this->language,
        ];
    }
}

Verileri İndeksleme

php artisan scout:import "App\Models\Post"

Mevcut tüm kayıtlar Meilisearch'e aktarılır. Yeni kayıtlar otomatik senkronize edilir.

Arama

Basit Arama

$posts = Post::search('laravel')->get();

Typo tolerance otomatik: laravel, larvel, laravelr — hepsi sonuç döner.

Filtreli Arama

$posts = Post::search('api')
    ->where('language', 'tr')
    ->get();

Sayfalama

$posts = Post::search('laravel')->paginate(10);

Çok Dilli Arama

Dil Bazlı Filtreleme

Post::search($keyword)
    ->where('language', app()->getLocale())
    ->get();

Ayrı İndeks (Alternatif)

public function searchableAs(): string
{
    return 'posts_' . $this->language;
}

Her dil için ayrı indeks — daha temiz ve kontrollü.

Queue ile Performans

Büyük veri setlerinde indeksleme işlemini queue'ya atın:

SCOUT_QUEUE=true

İndeksleme arka planda çalışır, kullanıcıyı bekletmez.

Ranking Kuralları

Varsayılan ranking genellikle yeterli ama özelleştirmek isterseniz:

// Meilisearch ayarları
$client = app(\Meilisearch\Client::class);
$client->index('posts')->updateSettings([
    'searchableAttributes' => ['title', 'content'],
    'rankingRules' => [
        'words',
        'typo',
        'proximity',
        'attribute',
        'sort',
        'exactness',
    ],
]);

title önce aranır, content sonra — başlık eşleşmeleri daha üstte çıkar.

Gerçek Hayat Senaryoları

  • Blog ve içerik platformları
  • E-ticaret ürün araması
  • SaaS dashboard araması
  • Admin panel filtreleme
  • Çok dilli siteler

Sonuç

Meilisearch + Laravel Scout ikilisi hızlı, kolay ve sürdürülebilir bir arama altyapısı sunuyor. Elasticsearch'ün karmaşıklığı ve maliyeti olmadan üst düzey arama deneyimi sağlamak mümkün. İçerik ağırlıklı Laravel projelerinde kesinlikle deneyin.