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.