Yazılım dünyasında arama konusu, geliştiriciler için çoğu zaman karmaşık ve zorlayıcı bir meydan okumadır. Veritabanından veriyi çekip göstermek kolay olsa da, milyonlarca kayıt arasında hızlı, esnek filtreleme ve anlık sonuçlar sunmak, kullanıcı deneyimi açısından kritik öneme sahiptir. Büyük ölçekli projelerde bu gereksinimleri minimum işlem süreleriyle karşılamak ise başlı başına bir uzmanlık alanı gerektirir. İşte tam da bu noktada Algolia devreye giriyor ve “Verini bana gönder, sana en hızlı arama deneyimini sunayım” diyor.
Algolia, sadece hızlı arama motoru olmakla kalmıyor, aynı zamanda otomatik tamamlama (autocomplete) ve anlık arama (instantsearch) gibi modern özelliklerle de öne çıkıyor. Elbette bu kalitede bir hizmetin ücretsiz olmadığını belirtmeye gerek yok. Hesabınızı oluşturarak 14 gün boyunca ücretsiz deneme şansınız var. Eğer Algolia’nın sunduğu performans ve kolaylık sizi etkilerse (ki aldığı ciddi yatırımlar, birçok kişinin etkilendiğini gösteriyor), aylık minimum 29$ ödeyerek bu güçlü servisi kullanmaya devam edebilirsiniz. Bu kadar büyük ölçekli ve kritik bir işlev için bu rakamın oldukça makul olduğunu söyleyebiliriz, zira performans söz konusu olduğunda yapılan yatırımın karşılığı fazlasıyla alınıyor.
Algolia’ya Başlangıç: İlk Adımlar
Algolia, birçok programlama dili için geniş bir destek sunar. Bu rehberde PHP ile nasıl kullanıldığını ele alacağız. İlk olarak, algolia.com adresinden bir hesap oluşturduğunuzu varsayıyoruz. Giriş yaptıktan sonra sizi bir kontrol paneli karşılayacak. Sol menüde yer alan Indices kısmına tıklayarak ve ardından Create Index diyerek yeni bir indeks oluşturalım. Bu indeks, verilerimizi depolayacağımız ve üzerinde arama yapacağımız ana yapıdır. İndeksin adı herkes tarafından görüleceği için anlamlı bir isim seçmeye özen gösterin; örneğin, “HOTELS” gibi.
Şimdi Algolia PHP paketini projemize dahil edelim. Bunun için Composer kullanacağız:
composer require algolia/algoliasearch-client-php
Daha sonra projenizin ana dosyasında (örneğin index.php) Composer’ın autoload dosyasını çağırarak paketi aktif hale getirmeniz gerekir:
require __DIR__ . '/vendor/autoload.php';
Algolia sınıfını başlatmak için appId ve apiKey değerlerinize ihtiyacınız olacak. Bu değerleri kontrol panelinizdeki sol menüde API Keys altında bulabilirsiniz. Ardından, oluşturduğunuz indekse bağlanmak için initIndex() metodunu kullanın:
<?php
require __DIR__ . '/vendor/autoload.php';
$client = AlgoliaAlgoliaSearchSearchClient::create(
'APP_ID',
'API_KEY'
);
$index = $client->initIndex('INDEX_ADINIZ');
?>Verileri Algolia’ya Gönderme
Artık mevcut indeksinize veri göndermeye hazırsınız. Tek bir veri nesnesi göndermek için saveObject(), birden fazla veri göndermek için ise saveObjects() metodlarını kullanırız. Veri gönderirken dikkat etmeniz gereken en önemli nokta, her nesnenin benzersiz bir objectID değerine sahip olması gerektiğidir. Eğer verinizde objectID adında bir anahtar yoksa ancak benzersiz bir ID’niz farklı bir isimle (örneğin ‘id’) yer alıyorsa, bunu objectIDKey parametresiyle eşleştirebilirsiniz:
try {
$data = [
'id' => 7,
'name' => 'Karavana Otel',
'star' => 5,
'location' => 'Alanya'
];
$index->saveObject($data, ['objectIDKey' => 'id']);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Birden fazla veri göndermek için ise verileri bir dizi içinde diziler olarak tanımlayıp saveObjects() metodunu kullanırız:
try {
$data = [
['id' => 8, 'name' => 'Test #1 Otel', 'star' => 4, 'location' => 'Adana'],
['id' => 9, 'name' => 'Test #2 Otel', 'star' => 5, 'location' => 'İzmir'],
['id' => 10, 'name' => 'Test #3 Otel', 'star' => 4, 'location' => 'Eskişehir']
];
$index->saveObjects($data, ['objectIDKey' => 'id']);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Veritabanınızdaki tüm verileri Algolia’ya aktarmak istediğinizde ise, veritabanı bağlantısı kurup sorgu sonuçlarını parçalar (chunk) halinde göndermek en iyi yaklaşımdır. Bu, büyük veri setlerinde bellek ve performans sorunlarını önler:
$db = new PDO('mysql:host=localhost;dbname=TEST;charset=utf8', 'KADI', 'ŞİFRE');
try {
$index->clearObjects(); // Mevcut indeksi boşalt
$query = $db->query('SELECT * FROM hotels')->fetchAll(PDO::FETCH_ASSOC);
foreach (array_chunk($query, 1000) as $row){
$index->saveObjects($row, ['objectIDKey' => 'id']);
}
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Index İçinde Arama Yapma
Verilerimizi Algolia’ya gönderdikten sonra arama yapmak oldukça basittir. search() metodu ile arama sorgunuzu gönderebilirsiniz:
try {
$result = $index->search('İstanbul Ephesus Hotel');
print_r($result);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Gelen sonuç çıktısı, eşleşen verinin detaylarını ve _highlightResult altında hangi kolonlarda eşleşme olduğunu, eşleşen kelimelerin vurgulanmış hallerini ve matchedWords gibi faydalı bilgileri içerir. Algolia, bu sorguları inanılmaz kısa sürelerde işler.
Arama Kriterlerini Kısıtlama ve Yönetme
Arama işleminin sadece belirli alanlarda yapılmasını isterseniz, setSettings() metodu ile searchableAttributes ayarını güncelleyebilirsiniz:
$index->setSettings([ 'searchableAttributes' => ['name', 'city', 'state'] ]);
Bu ayarla, arama artık sadece ‘name’, ‘city’ ve ‘state’ kolonlarında yapılacaktır. Örneğin, bir otelin e-posta adresini arasanız bile, bu alanlar arasında olmadığı için sonuç gelmeyecektir.
Veri Güncelleme ve Silme
Mevcut verileri güncellemek için partialUpdateObject() (tekil) ve partialUpdateObjects() (çoğul) metodlarını kullanırız. Güncelleme işlemi de objectID‘ye göre yapılır:
// objectID'si 5 olan otelin adını güncelledik $index->partialUpdateObject([ 'name' => 'Yeni Otel Adı', 'objectID' => '5' ]); // Birden fazla otelin adını güncelledik $index->partialUpdateObjects([ ['name' => 'Yeni Otel Adı', 'objectID' => '5'], ['name' => 'Yeni Otel Adı #2', 'objectID' => '6'] ]);
Veri silme işlemleri için ise deleteObject() (tekil) ve deleteObjects() (çoğul) metodları kullanılır. Silme de yine objectID değerine göre gerçekleştirilir:
$index->deleteObject(