Modern web uygulamalarında kullanıcı deneyimini belirleyen en kritik unsurlardan biri, şüphesiz arama yeteneğidir. Kullanıcılar, aradıkları bilgiye anında ulaşmayı beklerken, geliştiriciler büyük veri setlerinde hızlı ve alakalı sonuçlar sunmanın zorluklarıyla boğuşur. İşte tam da bu noktada Algolia devreye giriyor. Algolia, veritabanınızdaki karmaşık verileri alıp, saniyeler içinde zengin filtreleme seçenekleri ve minimum işlem süreleriyle kullanıcıya üst düzey bir arama deneyimi sunmayı vaat eden güçlü bir arama platformudur.
Sadece temel arama fonksiyonelliğiyle kalmayıp, autocomplete (otomatik tamamlama) ve instantsearch (anlık arama) gibi özelliklerle kullanıcıların arama süreçlerini daha da kolaylaştıran Algolia, sunduğu performans ve ölçeklenebilirlik ile dikkat çekiyor. Elbette bu seviyede bir hizmetin bir bedeli var; ancak 14 günlük ücretsiz deneme süresiyle platformu test edebilir, sunduğu değeri kendi gözlerinizle görebilirsiniz. Başlangıç paketi aylık 29 dolar gibi bir maliyetle gelse de, büyük ölçekli projeler için arama performansında sağladığı fark göz önüne alındığında bu rakamın oldukça makul olduğu söylenebilir. Unutmayın, iyi bir performans için yatırım yapmak çoğu zaman kaçınılmazdır.
Algolia’ya Başlangıç: PHP ile Entegrasyon
Algolia’nın gücünü projenize taşımak oldukça kolaydır, zira birçok programlama dili için kapsamlı SDK desteği sunar. Bu rehberde PHP ile nasıl entegrasyon yapılacağını adım adım inceleyeceğiz. İlk olarak, algolia.com adresinden bir hesap oluşturmanız ve giriş yaptıktan sonra dashboard’daki ‘Indices’ bölümünden ‘Create Index’ diyerek kendinize yeni bir indeks oluşturmanız gerekiyor. Bu indeks, verilerinizi Algolia’ya aktaracağınız ana yapıdır. Örneğin, otel verileri için ‘HOTELS’ adında bir indeks oluşturabilirsiniz.
Daha sonra, Composer kullanarak Algolia’nın PHP istemci paketini projenize dahil edin:
composer require algolia/algoliasearch-client-phpProjenizde bir index.php dosyası oluşturup vendor/autoload.php dosyasını dahil ettikten sonra, Algolia istemcisini appId ve apiKey değerlerinizle başlatın ve oluşturduğunuz indekse bağlanın. API Anahtarlarınızı Algolia dashboard’unuzdaki ‘API Keys’ bölümünden bulabilirsiniz.
<?php
require __DIR__ . '/vendor/autoload.php';
$client = AlgoliaAlgoliaSearchSearchClient::create(
'APP_ID',
'API_KEY'
);
$index = $client->initIndex('INDEX_ADINIZ');Veri Yönetimi: Ekleme, Güncelleme ve Silme
Veri Ekleme
Algolia’ya veri göndermek için saveObject() (tek veri için) veya saveObjects() (birden fazla veri için) metodlarını kullanabilirsiniz. Her nesnenin benzersiz bir objectID‘ye sahip olması gerektiğini unutmayın. Eğer verinizdeki benzersiz kimlik alanı farklı bir isimdeyse, 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çinse, bir dizi içinde nesneleri tanımlayıp saveObjects() metodunu kullanın:
try {
$data = [
[
'id' => 8,
'name' => 'Test #1 Otel',
'star' => 4,
'location' => 'Adana'
],
[
'id' => 9,
'name' => 'Test #2 Otel',
'star' => 5,
'location' => 'İzmir'
]
];
$index->saveObjects($data, ['objectIDKey' => 'id']);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Veritabanınızdaki tüm verileri Algolia’ya aktarmak içinse, verileri parçalara bölerek (chunking) göndermek daha verimli bir yaklaşımdır:
$db = new PDO('mysql:host=localhost;dbname=TEST;charset=utf8', 'KADI', 'ŞİFRE');
try {
// mevcut indeksi boşaltıyoruz
$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();
}Veri Güncelleme ve Silme
Mevcut verileri güncellemek için partialUpdateObject() veya partialUpdateObjects() metodlarını kullanabilirsiniz. Bu metodlar, yalnızca belirtilen alanları günceller.
// objectID 5 olan otelin adını güncelledik
$index->partialUpdateObject([
'name' => 'Yeni Otel Adı',
'objectID' => '5'
]);Verileri silmek içinse deleteObject() veya deleteObjects() metodları kullanılır ve silme işlemi objectID değerine göre yapılır.
$index->deleteObject("1");
$index->deleteObjects(["1", "2"]);Gelişmiş Arama ve Filtreleme Özellikleri
İndeks İçinde Arama Yapma
Verileriniz Algolia’ya aktarıldıktan sonra arama yapmak oldukça basittir. search() metodunu kullanarak sorgunuzu gönderebilirsiniz:
try {
$result = $index->search('İstanbul Ephesus Hotel');
print_r($result);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Dönen sonuçlar arasında _highlightResult alanı, hangi alanların sorguyla eşleştiğini ve bu eşleşmelerin nasıl vurgulandığını gösterir. Bu, kullanıcıya arama sonuçlarının neden alakalı olduğunu görsel olarak sunmak için oldukça değerlidir.
Arama Kriterlerini Kısıtlama
Arama işleminin sadece belirli alanlarda yapılmasını istiyorsanız, setSettings() metodu ile searchableAttributes ayarını güncelleyebilirsiniz:
$index->setSettings([
'searchableAttributes' => ['name', 'city', 'state']
]);Bu ayar sayesinde, Algolia artık sadece ‘name’, ‘city’ ve ‘state’ alanlarında arama yapacaktır, diğer alanlardaki eşleşmeleri dikkate almayacaktır.
Verileri Kategorize Etme (Facetler)
Algolia’nın en güçlü özelliklerinden biri de facet (kategori) tabanlı filtrelemedir. Verilerinizi yıldıza, şehre veya bölgeye göre kategorize etmek isterseniz, attributesForFaceting ayarını kullanın:
$index->setSettings([
'attributesForFaceting' => ['city', 'state', 'star']
]);Böylece, arama sorgularınıza ek olarak belirli kategorilere göre filtreleme uygulayabilirsiniz:
$result = $index->search('İstanbul', [
'facetFilters' => [
'state:Şişli',
'star:3'
]
]);
print_r($result);InstantSearch.js ile Ön Yüz Deneyimi
Algolia, arama deneyimini kullanıcı arayüzüne taşımak için InstantSearch.js adında zengin bir JavaScript kütüphanesi sunar. Bu kütüphane, arama kutuları, filtre listeleri, sonuç göstericiler ve sayfalama gibi birçok hazır widget ile gelir. Bu widget’lar sayesinde, birkaç satır kodla dinamik ve etkileşimli bir arama arayüzü oluşturabilirsiniz. Kütüphanenin tam dökümantasyonuna buradan ulaşabilirsiniz.
Öncelikle HTML yapınızı hazırlayın:
<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üphanesini ve widget’ları kullanarak arama arayüzünüzü oluşturun. Unutmayın, istemci tarafında API_KEY yerine sadece arama işlemleri için verilen SEARCH_ONLY_API_KEY‘i kullanmalısınız.
<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>WordPress ile Algolia
Eğer bir WordPress siteniz varsa, Algolia’nın gücünü sitenize entegre etmek çok daha kolaydır. WordPress için geliştirilmiş birçok eklenti sayesinde, sitenizin varsayılan arama fonksiyonelliğini Algolia’nın yüksek performanslı altyapısına taşıyabilirsiniz. Örneğin, “WP Search with Algolia” eklentisi, sitenizin arama deneyimini ciddi ölçüde iyileştiren, kullanımı kolay ve etkili bir çözümdür. Bu tür bir eklentiyle, sitenizdeki içerikleri Algolia indekslerine otomatik olarak aktarabilir ve ziyaretçilerinize anlık, alakalı arama sonuçları sunabilirsiniz.
Algolia, modern web uygulamalarının ve e-ticaret sitelerinin olmazsa olmazı haline gelen hızlı ve güçlü arama yeteneklerini parmaklarınızın ucuna getiriyor. Geliştiriciler için karmaşık arama algoritmalarıyla uğraşma yükünü ortadan kaldırırken, kullanıcılara da beklentilerinin ötesinde bir deneyim sunuyor. İster küçük bir blog, ister büyük ölçekli bir e-ticaret platformu yönetiyor olun, Algolia’nın sunduğu esneklik ve performans, sitenizin arama motorunu dönüştürmek için harika bir fırsat sunuyor. Platformun derinlemesine dökümanlarını inceleyerek, projenizin özel ihtiyaçlarına göre daha birçok gelişmiş özelliği keşfedebilir ve dijital varlığınızın arama yeteneklerini bir sonraki seviyeye taşıyabilirsiniz.