Web uygulamalarında hızlı ve performanslı arama yapmak, kullanıcı deneyimini geliştiren en önemli unsurlardan biridir. Laravel projelerinde, ElasticSearch gibi güçlü bir arama motoru kullanarak verimli bir arama altyapısı oluşturabilirsiniz. Bu yazıda, Laravel ile ElasticSearch entegrasyonunu detaylı bir şekilde ele alacak, adım adım kurulum, yapılandırma ve kullanım örnekleri sunacağım.
ElasticSearch Nedir?
ElasticSearch, açık kaynaklı bir arama ve analiz motorudur. Özellikle büyük veri setlerinde, tam metin araması ve analitik işlemler için yaygın olarak kullanılır. Bazı temel özellikleri şunlardır:
- Tam metin arama: Büyük veri setlerinde bile hızlı sonuç verir.
- Gerçek zamanlı indeksleme: Veriler anlık olarak sorgulanabilir hale gelir.
- Ölçeklenebilirlik: Büyük veri ve kullanıcı taleplerini karşılayacak şekilde yatayda genişletilebilir.
- RESTful API desteği: HTTP üzerinden kolayca entegre edilebilir.
1. Elasticsearch Kurulumu
Docker ile Elasticsearch Kurulumu
Eğer bilgisayarınızda Elasticsearch yüklü değilse, Docker ile hızlıca kurabilirsiniz:
Adım 1: Elasticsearch ve Kibana'yı ayağa kaldırmak için aşağıdaki docker-compose.yml dosyasını oluşturun:
version: '3.7'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.10.0
container_name: kibana
ports:
- "5601:5601"
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
Adım 2: Docker container'larını başlatmak için terminalden şu komutu çalıştırın:
docker-compose up -d
Artık Elasticsearch localhost:9200, Kibana ise localhost:5601 adreslerinde çalışıyor olacak.
2. Laravel Projesine Elasticsearch Paketi Ekleme
Laravel için Elasticsearch entegrasyonunda genellikle resmi PHP istemcisi kullanılır.
Adım 1: Elasticsearch PHP kütüphanesini yükleyin:
composer require elasticsearch/elasticsearch
Adım 2: config/services.php dosyasına Elasticsearch yapılandırmasını ekleyin:
'elasticsearch' => [
'hosts' => [
env('ELASTICSEARCH_HOST', 'localhost:9200'),
],
],
Adım 3: .env dosyasına Elasticsearch bağlantı bilgilerini ekleyin:
ELASTICSEARCH_HOST=localhost:9200
3. Servis Sağlayıcı ve Bağımlılık Tanımlama
Elasticsearch istemcisini Laravel container'ına eklemek için bir servis sağlayıcı oluşturalım.
Adım 1: Bir servis sağlayıcı oluşturun:
php artisan make:provider ElasticsearchServiceProvider
Adım 2: Aşağıdaki kodu app/Providers/ElasticsearchServiceProvider.php dosyasına ekleyin:
namespace App\Providers;
use Elasticsearch\ClientBuilder;
use Illuminate\Support\ServiceProvider;
class ElasticsearchServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('Elasticsearch', function () {
return ClientBuilder::create()
->setHosts(config('services.elasticsearch.hosts'))
->build();
});
}
}
Adım 3: Bu servis sağlayıcıyı config/app.php dosyasına ekleyin:
'providers' => [
// ...
App\Providers\ElasticsearchServiceProvider::class,
],
4. Model Entegrasyonu
Elasticsearch ile bir modelin verilerini indekslemek için gerekli metodları tanımlayalım.
Adım 1: Kullanıcılar için bir User modeli oluşturun (varsa bu adımı atlayabilirsiniz):
php artisan make:model User -m
Adım 2: Aşağıdaki kodları app/Models/User.php dosyasına ekleyin:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $fillable = ['name', 'email', 'skills'];
public function toSearchableArray()
{
return [
'name' => $this->name,
'email' => $this->email,
'skills' => $this->skills,
];
}
}
Adım 3: Kullanıcıların verilerini Elasticsearch'e eklemek için bir metot tanımlayın:
public function indexInElasticsearch()
{
app('Elasticsearch')->index([
'index' => 'users',
'id' => $this->id,
'body' => $this->toSearchableArray(),
]);
}
5. Arama Repository'si
Arama işlemlerini merkezi bir sınıfta yönetmek için bir Repository oluşturalım.
Adım 1: app/Repositories/ElasticsearchRepository.php dosyasını oluşturun:
namespace App\Repositories;
class ElasticsearchRepository
{
private $elasticsearch;
public function __construct()
{
$this->elasticsearch = app('Elasticsearch');
}
public function search(string $query)
{
return $this->elasticsearch->search([
'index' => 'users',
'body' => [
'query' => [
'multi_match' => [
'query' => $query,
'fields' => ['name', 'email', 'skills'],
],
],
],
]);
}
}
6. Controller Entegrasyonu
Arama işlemini bir Controller üzerinden yönetelim.
Adım 1: Bir arama kontrolcüsü oluşturun:
php artisan make:controller SearchController
Adım 2: Aşağıdaki kodu app/Http/Controllers/SearchController.php dosyasına ekleyin:
namespace App\Http\Controllers;
use App\Repositories\ElasticsearchRepository;
use Illuminate\Http\Request;
class SearchController extends Controller
{
private $repository;
public function __construct(ElasticsearchRepository $repository)
{
$this->repository = $repository;
}
public function search(Request $request)
{
$query = $request->input('query');
$results = $this->repository->search($query);
return response()->json($results);
}
}
7. Route Tanımlaması
Adım 1: routes/api.php dosyasına şu kodu ekleyin:
use App\Http\Controllers\SearchController;
Route::get('/search', [SearchController::class, 'search']);
Performans ve Optimizasyon İpuçları
- Arka plan işlemleri: Büyük veri setlerini indekslerken Laravel Queue'larını kullanın.
- Önbellekleme: Sorgu sonuçlarını Redis gibi bir önbellek yapısıyla saklayın.
- Düzenli indeksleme: Veri tutarlılığını sağlamak için dizinlerinizi düzenli olarak optimize edin.
Sonuç
Bu adımları takip ederek, Laravel projelerinizde Elasticsearch ile güçlü ve performanslı bir arama sistemi kurabilirsiniz. Elasticsearch, büyük veri kümelerinde tam metin arama ve analiz ihtiyaçlarınızı karşılayarak kullanıcı deneyimini büyük ölçüde geliştirecektir.
