Yazılım dünyasında arama konusu, geliştiriciler için her zaman zorlayıcı bir alan olmuştur. Önemli olan, veri tabanındaki bilgiyi alıp ekranda göstermekten çok daha fazlasıdır; büyük ölçekli filtreleme işlemleriyle bile minimum işlem süreleri sunarak kullanıcılara kusursuz bir arama deneyimi yaşatmaktır. Bu, özellikle büyük ve karmaşık projelerde hiç de kolay bir iş değildir. İşte tam da bu noktada Algolia devreye giriyor ve diyor ki: “Verinizi bana gönderin, ben size en hızlı ve en etkili arama hizmetini sunayım.”
Algolia, sadece temel arama işlevselliği sunmakla kalmıyor, aynı zamanda otomatik tamamlama (autocomplete) ve anlık arama (instantsearch) gibi özelliklerle kullanıcı deneyimini zirveye taşıyor. Elbette, bu kalitede bir hizmetin ücretli olduğunu belirtmek gerekir. Ancak, yeni kullanıcılar için 14 günlük ücretsiz deneme süresi mevcut. Bu süre zarfında Algolia’nın performansına ve sunduğu kolaylıklara yakından tanık olabilirsiniz. Eğer bu deneyimden memnun kalırsanız (ki aldığı ciddi yatırımlar ve yaygın kullanımı, birçok kişinin memnun kaldığını gösteriyor), aylık minimum 29 dolarlık bir ücretle servisi kullanmaya devam edebilirsiniz. Büyük ölçekli projeler için arama performansının kritik olduğu düşünüldüğünde, bu rakamın sunduğu değerin yanında oldukça makul olduğu söylenebilir. Elbette 29 dolarlık paketin belirli limitleri var, ancak performans sizin için öncelikliyse, bu yatırımın karşılığını fazlasıyla alacağınızdan emin olabilirsiniz.
Algolia Nasıl Kullanılır? PHP Örneğiyle Adım Adım
Algolia, birçok programlama dili için kapsamlı destek sunar. Bu bölümde, PHP ile Algolia’nın nasıl kullanılacağını adım adım inceleyeceğiz. İlk olarak, algolia.com adresine kayıt olduğunuzu varsayıyorum. Giriş yaptıktan sonra sizi bir kontrol paneli karşılayacaktır. Sol menüdeki Indices kısmına tıklayarak Create Index seçeneği ile yeni bir dizin oluşturalım. Bu dizin, verilerimizi aktaracağımız ana yapı olacak. Dizin adı herkes tarafından görüleceği için anlamlı bir isim seçmeye özen gösterin; benim örneğimde bu dizine HOTELS adını verdim.
Algolia PHP Paketini Kurma ve Başlatma
Daha sonra, Composer kullanarak Algolia’nın PHP paketini projenize dahil etmelisiniz:
composer require algolia/algoliasearch-client-php
Ardından, bir index.php dosyası oluşturup vendor/autoload.php dosyasını ekleyerek paketi projenize dahil edin. Algolia sınıfını başlatmak için appId ve apiKey değerlerinizi kullanmanız gerekecek. Bu değerleri kontrol panelinizdeki API Keys bölümünde bulabilirsiniz. initIndex() metodu ile oluşturduğunuz dizine (benim örneğimde HOTELS) bağlanıyoruz:
<?php
require __DIR__ . '/vendor/autoload.php';
$client = AlgoliaAlgoliaSearchSearchClient::create(
'APP_ID',
'API_KEY'
);
$index = $client->initIndex('INDEX_ADINIZ');Veri Gönderme: Tekil ve Toplu İşlemler
Artık oluşturduğunuz dizine veri göndermeye hazırsınız. Tek bir veri göndermek için saveObject(), birden fazla veri göndermek için ise saveObjects() metodunu kullanırız. Ancak burada önemli bir nokta var: Algolia’ya gönderilen her nesnenin benzersiz bir objectID‘ye sahip olması gerekir. Eğer verinizde farklı bir isimde benzersiz bir anahtar varsa, bunu objectIDKey parametresi ile 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 toplayı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 otel verilerini Algolia’ya aktarmak istediğinizde, verileri küçük parçalara (chunk) bölerek göndermek daha verimli olacaktır. Ayrıca, dizini yeniden doldurmadan önce mevcut verileri temizlemek isteyebilirsiniz:
$db = new PDO('mysql:host=localhost;dbname=TEST;charset=utf8', 'KADI', 'ŞİFRE');
try {
// index'in içindekileri boşalttık
$index->clearObjects();
$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
Verilerinizi Algolia’ya aktardıktan sonra arama yapmak oldukça basittir. search() metodunu kullanarak dizininizdeki veriler arasında arama yapabilirsiniz:
try {
$result = $index->search('İstanbul Ephesus Hotel');
print_r($result);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Bu metod, eşleşen verinin detaylarını ve _highlightResult anahtarı altında hangi kolonların ne kadar eşleştiğiyle ilgili bilgileri içeren kapsamlı bir çıktı döndürür. Eşleşen kısımlar <em></em> etiketleriyle vurgulanır ve matchedWords altında tek tek listelenir. Tüm bunlar, inanılmaz kısa işlem süreleriyle gerçekleşir.
Arama Kriterlerini Kısıtlama
Arama işleminin sadece belirli kolonlarda (örneğin otel adı, şehir ve bölge) yapılmasını isterseniz, setSettings() metodunu kullanarak ayarlarınızı güncelleyebilirsiniz:
$index->setSettings([ 'searchableAttributes' => ['name', 'city', 'state'] ]);
Bu ayar sayesinde, arama artık sadece belirtilen bu üç kolonda gerçekleşecek ve diğer alanlardaki eşleşmeler dikkate alınmayacaktır.
Veri Güncelleme ve Silme
Mevcut bir veya birden fazla veriyi güncellemek için partialUpdateObject() ve partialUpdateObjects() metodları kullanılır. Bu metodlar, belirtilen objectID‘ye sahip nesnelerin sadece gönderilen alanlarını günceller:
// objectID 5 olan otelin name değerini güncelledik
$index->partialUpdateObject([
'name' => 'Yeni Otel Adı',
'objectID' => '5'
]);
// birden fazla otel adını objectID'lerine göre 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() ve deleteObjects() metodları kullanılır. Silme işlemleri de objectID değerine göre yapılır:
$index->deleteObject("1");
$index->deleteObjects(["1", "2"]);Verileri Kategorize Etme (Faceting)
Algolia’ya gönderdiğiniz verileri kategorize etmek ve filtrelemek için Facet’ler kullanılır. Örneğin, otel dizininizdeki verileri yıldıza, şehre ve bölgeye göre kategorize edebilirsiniz. Bunun için ayarlarınızı şu şekilde güncellemeniz gerekir:
$index->setSettings([ 'attributesForFaceting' => ['city', 'state', 'star'] ]);
Bu sayede, arama yaparken belirli kriterlere göre filtreleme uygulayabilirsiniz. Örneğin, “İstanbul” otellerini ararken sadece “Şişli” bölgesindeki ve “3 yıldızlı” olanları bulmak için aşağıdaki gibi bir sorgu kullanabilirsiniz:
$result = $index->search('İstanbul', [
'facetFilters' => [
'state:Şişli',
'star:3'
]
]);
print_r($result);InstantSearch.js ile Dinamik Arama Arayüzleri
Algolia, client tarafında kullanıcı dostu ve dinamik arama arayüzleri oluşturmak için InstantSearch.js adında bir JavaScript kütüphanesi sunar. Bu kütüphane, çeşitli widget’lar (bileşenler) aracılığıyla kolayca filtreleme, listeleme ve sayfalama işlemleri yapmanızı sağlar. Tasarımınıza uygun olarak CSS değişiklikleri yaparak bu widget’ları tamamen özelleştirebilirsiniz. InstantSearch.js’in tüm dökümanlarına buradan ulaşabilirsiniz.
InstantSearch.js Kurulumu ve Widget Kullanımı
Öncelikle, HTML yapınızı arama bileşenleri için hazırlamanız gerekir:
<aside class="sidebar">
<section class="widget">
<h3>Şehirler</h3>
<div id="cities"></div>
</section>
<section class="widget">
<h3>Bölgeler</h3>
<div id="states"></div>
</section>
</aside>
<main class="container">
<div id="search"></div>
<div id="stats"></div>
<section class="hotels">
<div id="hotels"></div>
</section>
<div id="pagination"></div>
</main>Ardından, InstantSearch.js kütüphanelerini dahil edip widget’ları HTML elemanlarına bağlayarak arama arayüzünü oluşturabilirsiniz. Client tarafında güvenlik nedeniyle SEARCH_ONLY_API_KEY kullanmanız gerektiğini unutmayın:
<script src="https://cdn.jsdelivr.net/npm/algoliasearch@3.35.0/dist/algoliasearchLite.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4.0.0/dist/instantsearch.production.min.js"></script>
<script>
var searchClient = algoliasearch('APP_ID', 'SEARCH_ONLY_API_KEY');
var search = instantsearch({
indexName: 'INDEX_ADINIZ',
searchClient,
});
search.addWidgets([
instantsearch.widgets.searchBox({
container: '#search',
placeholder: 'Otellerde arayın..'
}),
instantsearch.widgets.refinementList({
container: '#cities',
attribute: 'city',
}),
instantsearch.widgets.refinementList({
container: '#states',
attribute: 'state',
}),
instantsearch.widgets.hits({
container: '#hotels',
templates: {
item(hit) {
return `<div class="hotel-single">
<img src="${hit.image ? hit.image.replace('.png', '_anasayfa.png') : 'https://xxxxxx.com/public/images/no-photo.png'}" alt="">
<div class="hotel-name">${hit.name}</div>
<div class="hotel-location">${hit.city} / ${hit.state}</div>
</div>`;
}
},
}),
instantsearch.widgets.pagination({
container: '#pagination',
}),
instantsearch.widgets.stats({
container: '#stats',
templates: {
text: `
{{#hasNoResults}}Sonuç bulunamadı{{/hasNoResults}}
{{#hasOneResult}}1 sonuç{{/hasOneResult}}
{{#hasManyResults}}{{#helpers.formatNumber}}{{nbHits}}{{/helpers.formatNumber}} sonuç bulundu{{/hasManyResults}}
({{processingTimeMS}}ms)
`,
}
})
]);
search.start();
</script>Bu kodlar ve biraz CSS ile dinamik ve hızlı bir arama arayüzü oluşturabilirsiniz. Örnek bir demoyu buradan inceleyebilirsiniz.
WordPress için Algolia Entegrasyonu
Eğer WordPress altyapısını kullanan bir web siteniz varsa, Algolia’nın mevcut eklentileri sayesinde sitenizin arama işlevselliğini kolayca Algolia’ya taşıyabilirsiniz. Örneğin, “WP Search with Algolia” gibi eklentiler, kurulumu ve entegrasyonu oldukça basitleştirir. Bu tür bir eklenti kullanarak sitenizdeki arama deneyimini ciddi ölçüde iyileştirebilir ve Algolia’nın sunduğu hızı ve doğruluğu kendiniz test edebilirsiniz.
Algolia, modern web uygulamalarının ve büyük veri tabanlarının karşılaştığı arama zorluklarına güçlü ve ölçeklenebilir bir çözüm sunar. Geliştiricilerin arama motoru optimizasyonu ve kullanıcı deneyimi konusunda harcadığı zamanı minimize ederken, son kullanıcılara da akıcı ve anlık sonuçlarla etkileyici bir deneyim yaşatır. Bu platformun sunduğu esneklik ve zengin özellik seti, uygulamanızın arama yeteneklerini bir üst seviyeye taşıyarak rekabet avantajı elde etmenizi sağlayacaktır.