Yazılım dünyasında arama, geliştiricilerin en çok zorlandığı konulardan biridir. Veritabanındaki veriyi alıp göstermek nispeten kolay olsa da, büyük ölçekli projelerde filtreleme işlemleri, anlık sonuçlar ve minimum işlem süreleriyle kullanıcılara sorunsuz bir arama deneyimi sunmak, ciddi bir mühendislik gerektirir. İşte tam da bu noktada Algolia devreye giriyor ve ‘Verinizi bana gönderin, size en hızlı ve en iyi arama hizmetini sunayım’ diyor.
Algolia, sunduğu otomatik tamamlama (autocomplete) ve anlık arama (instantsearch) gibi gelişmiş özelliklerle bu alanda fark yaratıyor. Elbette bu kalitede bir hizmetin ücretsiz olmasını beklemek haksızlık olur. Ancak, 14 gün boyunca ücretsiz deneme süresi sunarak platformu yakından tanımanıza olanak tanıyor. Eğer sunduğu performans ve kolaylık sizi ikna ederse (ki aldığı yatırımlara bakılırsa, birçok kişiyi ikna etmiş durumda), aylık minimum 29 dolarlık bir ücretle bu servisi kullanmaya devam edebilirsiniz. Büyük ölçekli projeler için bu rakam, sağladığı değer düşünüldüğünde oldukça makul sayılabilir. Elbette 29 dolarlık paketin belirli limitleri var, ancak yüksek performans ve ölçeklenebilirlik arıyorsanız, bu yatırıma değer olduğunu göreceksiniz.
Algolia Nasıl Kullanılır?
Algolia, birçok programlama dili için kapsamlı destek sunar. Bu yazıda PHP ile kullanımını detaylı bir şekilde inceleyeceğiz. İlk adım olarak algolia.com adresinden bir hesap oluşturduğunuzu varsayıyorum. Giriş yaptıktan sonra sizi bir kontrol paneli karşılayacaktır. Sol menüde Indices kısmına tıklayarak ve ardından Create Index diyerek yeni bir indeks oluşturalım. Bu indeks, verilerimizi depolayacağı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, ben bu örnekte HOTELS adında bir indeks oluşturdum.
Şimdi Composer aracılığıyla Algolia’nın PHP paketini projemize dahil edelim:
composer require algolia/algoliasearch-client-php
Ardından, projenizin ana dizininde bir index.php dosyası oluşturun ve paketi vendor/autoload.php dosyasını çağırarak 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 sol menüde API Keys altında bulabilirsiniz. Daha sonra initIndex() metodu ile oluşturduğumuz indekse (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');Artık mevcut indeksinize veri göndermeye hazırsınız. Tek bir veri göndermek için saveObject(), birden fazla veri göndermek için ise saveObjects() metodlarını kullanacağız. Tek bir veri gönderme örneği:
try {
$data = [
'id' => 7,
'name' => 'Karavana Otel',
'star' => 5,
'location' => 'Alanya'
];
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Bu kodu çalıştırdığınızda büyük ihtimalle aşağıdaki gibi bir hata alacaksınız:
All objects must have an unique objectID (like a primary key) to be valid. If your batch has a unique identifier but isn’t called objectID, you can map it automatically using `saveObjects($objects, [‘objectIDKey’ => ‘primary’])` Algolia is also able to generate objectIDs automatically but *it’s not recommended*. To do it, use `saveObjects($objects, [‘autoGenerateObjectIDIfNotExist’ => true])`
Bu hata, gönderilen her verinin mutlaka objectID adında sayısal ve benzersiz bir değere sahip olması gerektiğinden kaynaklanır. Eğer verinizde benzersiz bir anahtar varsa ancak adı objectID değilse, bunu aşağıdaki gibi 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();
}Bu değişiklik ile hata almadan veriyi Algolia’ya göndermiş olacaksınız. Kontrol panelinizdeki indeksinize bakarak verinin eklendiğini görebilirsiniz.

Birden fazla veri göndermek için ise aşağıdaki gibi bir array içerisinde birden fazla veri tanımlayarak 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 veriyi Algolia’ya aktarmak için aşağıdaki gibi bir PDO bağlantısı ile verileri çekip, 1000’erli bloklar halinde gönderebilirsiniz:
$db = new PDO('mysql:host=localhost;dbname=TEST;charset=utf8', 'KADI', 'ŞİFRE');
try {
// index'in içindeki mevcut verileri temizledik
$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
Verilerimizi Algolia’ya aktardıktan sonra, indeksimiz üzerinde hızlıca arama yapabiliriz:
try {
$result = $index->search('İstanbul Ephesus Hotel');
print_r($result);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Bu kod, bize eşleşen verinin detaylarını ve _highlightResult altında hangi kolonlarda ne kadar eşleşme olduğunu gösteren zengin bir çıktı sunar. Eşleşen yerler <em></em> etiketleriyle vurgulanır ve matchedWords altında tek tek listelenir. Tüm bu işlemler inanılmaz kısa sürelerde gerçekleşir.
Arama Kriterlerini Kısıtlama
Arama işlemini belirli kolonlarla sınırlamak isterseniz, setSettings() metodunu kullanabilirsiniz. Örneğin, aramayı sadece otel adı, şehir ve bölge ile kısıtlamak için:
$index->setSettings([ 'searchableAttributes' => ['name', 'city', 'state'] ]);
Bu ayar ile artık mail adresinden arama yapılamazken, otelin adını, şehrini veya bölgesini yazarak eşleşen sonuçları bulmaya devam edebilirsiniz.
Veri Güncelleme ve Silme
Mevcut verileri güncellemek için partialUpdateObject() (tekli) ve partialUpdateObjects() (çoklu) metodları kullanılır. Güncelleme işlemi objectID değerine göre yapılır:
// 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() (tekli) ve deleteObjects() (çoklu) metodları kullanılır. Silme işlemi de objectID değerine göre gerçekleştirilir:
$index->deleteObject("1");
$index->deleteObjects(["1", "2"]);Verileri Kategorilemek (Faceting)
Algolia’ya gönderdiğiniz verileri kategorize etmek ve filtreleme seçenekleri sunmak için Facet’ler kullanılır. Örneğin, otel indeksinizdeki verileri yıldıza, şehre ve bölgeye göre kategorize edebilirsiniz. Bunun için ayarınızı şu şekilde güncellersiniz:
$index->setSettings([ 'attributesForFaceting' => ['city', 'state', 'star'] ]);
Bu sayede arama yaparken, örneğin ‘İstanbul’ otellerini ara ama sadece ‘Şişli’ bölgesindeki ve ‘3’ yıldızlı olanları bul gibi spesifik filtreler uygulayabilirsiniz:
$result = $index->search('İstanbul', [
'facetFilters' => [
'state:Şişli',
'star:3'
]
]);
print_r($result);InstantSearch.js ile Ön Yüz Entegrasyonu
Algolia, zengin bir kullanıcı arayüzü deneyimi sunmak için bir dizi widget’tan oluşan InstantSearch.js kütüphanesini sağlar. Bu widget’lar sayesinde kategorize ettiğiniz verileri kolayca filtreleyebilir ve listeleyebilirsiniz. Tasarımınıza uygun olarak CSS değişiklikleri yapmanız da mümkündür. Detaylı dökümanlara buradan ulaşabilirsiniz: https://www.algolia.com/doc/api-reference/widgets/js/
Öncelikle temel HTML yapımızı oluşturalım:
<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>Ve bu HTML yapısına uygun olarak widget’larımızı ekleyen JavaScript kodunu yazalım:
<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>Unutmayın, istemci tarafında API Key yerine size özel olarak verilen Search Only Key’i kullanmanız güvenlik açısından önemlidir. Bu anahtar sadece arama işlemleri için tasarlanmıştır. Yukarıdaki kodlara biraz CSS eklediğinizde, Algolia’nın güçlü arama yeteneklerini kullanıcılarınıza sunan etkileyici bir arayüze sahip olabilirsiniz. Demoyu inceleyerek nasıl göründüğünü keşfedebilirsiniz: http://www.erbilen.net/demo/algolia/
WordPress için Algolia
Eğer WordPress altyapısına sahip bir web siteniz varsa, mevcut Algolia eklentilerini kullanarak sitenizin arama özelliğini Algolia’nın süper gücüyle değiştirmek oldukça kolaydır. Örneğin, erbilen.net’te kullanılan eklenti şudur:
Bu eklenti, işini tam anlamıyla yapan ve WordPress sitelerinizde küçük bir test yaparak bile Algolia’nın hız ve performans farkını anında görmenizi sağlayan harika bir çözümdür. Algolia, modern web uygulamalarının ve e-ticaret sitelerinin arama beklentilerini karşılamakla kalmayıp, bu beklentilerin ötesine geçerek kullanıcı deneyimini zirveye taşıyan güçlü bir araçtır. Geliştiricilere sunduğu esneklik ve zengin özellik seti ile projelerinizdeki arama sorunlarını kökten çözerek, kullanıcılarınıza akıcı ve anlık bir keşif imkanı sunar. Algolia’nın sunduğu bu potansiyeli keşfetmek, uygulamanızın değerini artırmanın anahtarlarından biri olabilir.