Yazılım dünyasında arama konusu, geliştiricilerin en çok zorlandığı alanlardan biridir. Veritabanındaki veriyi alıp göstermek nispeten kolay olsa da, büyük ölçekli projelerde filtreleme işlemlerini hızlandırmak ve kullanıcılara anında, kusursuz bir arama deneyimi sunmak ciddi bir meydan okumadır. İşte tam bu noktada Algolia devreye giriyor. Algolia, verilerinizi ona göndermeniz karşılığında size en hızlı ve en gelişmiş arama hizmetini sunmayı vaat ediyor.
Otomatik tamamlama (autocomplete) ve anlık arama (instantsearch) gibi özellikleriyle öne çıkan Algolia’nın ücretli bir servis olduğunu belirtmekte fayda var. Ancak endişelenmeyin, yeni kullanıcılar için 14 günlük ücretsiz deneme süresi bulunuyor. Bu süre zarfında Algolia’nın gücünü ve projenize katacağı değeri bizzat deneyimleyebilirsiniz. Eğer deneyiminizden memnun kalırsanız (ki günümüzdeki ciddi yatırımlar ve kullanıcı memnuniyeti göz önüne alındığında bu oldukça muhtemel), aylık minimum 29$ gibi bir ücretle servisi kullanmaya devam edebilirsiniz.
Böylesine büyük ölçekli ve performans odaklı bir çözüm için bu rakamın, sağlayacağı faydalar düşünüldüğünde oldukça makul olduğunu söyleyebiliriz. Elbette 29$’lık paketin belirli limitleri var, ancak yüksek performans ve üstün kullanıcı deneyimi arıyorsanız, bu yatırımın karşılığını fazlasıyla alacağınızdan emin olabilirsiniz.
Algolia Nasıl Kullanılır? PHP Örneği
Algolia, birçok programlama dili için kapsamlı destek sunar. Bu yazıda sizlere PHP ile nasıl kullanacağınızı adım adım göstereceğim. İlk olarak algolia.com adresine kayıt olduğunuzu varsayıyorum. Giriş yaptıktan sonra sizi bir kontrol paneli karşılayacak. Sol menüde Indices kısmına tıklayarak Create Index seçeneğiyle yeni bir indeks oluşturalım. Bu indeks, verilerimizi barındıracak ana yapıdır. İndeksin adını herkesin görebileceği bir şekilde, projenize uygun olarak belirlemelisiniz. Ben örneğimde HOTELS adında bir indeks oluşturdum.
Şimdi sıra Algolia’nın PHP paketini projemize dahil etmeye geldi. Composer kullanarak kolayca kurulum yapabiliriz:
composer require algolia/algoliasearch-client-php
Daha sonra projenizin ana dizininde bir index.php dosyası oluşturun ve paketi vendor/autoload.php dosyasını dahil ederek projenize ekleyin.
Algolia sınıfını başlatmak için appId ve apiKey değerlerinizi kullanmalısınız. Bu değerleri Algolia kontrol panelinizde sol menüdeki API Keys bölümünden bulabilirsiniz. Ardından initIndex() metodu ile oluşturduğunuz indekse (örneğimizde HOTELS) bağlanıyoruz:
<?php
require __DIR__ . '/vendor/autoload.php';
$client = AlgoliaAlgoliaSearchSearchClient::create(
'APP_ID',
'API_KEY'
);
$index = $client->initIndex('INDEX_ADINIZ');Veri Ekleme ve Güncelleme
Artık 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ı kullanırız. Örnek olarak tek bir veri göndermeyi deneyelim:
try {
$data = [
'id' => 7,
'name' => 'Karavana Otel',
'star' => 5,
'location' => 'Alanya'
];
$index->saveObject($data, ['objectIDKey' => 'id']);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Yukarıdaki örnekte dikkat etmeniz gereken önemli bir nokta var: Algolia’ya gönderilen her veride benzersiz bir objectID değeri bulunmalıdır. Eğer verinizde objectID adında bir anahtar yoksa ancak benzersiz bir değeriniz (örneğin veritabanınızdaki `id` alanı) farklı bir isimle yer alıyorsa, objectIDKey parametresiyle bu eşleştirmeyi yapabilirsiniz. Bu sayede Algolia veriyi doğru şekilde indeksleyecektir. Aynı mantıkla, birden fazla veriyi göndermek için saveObjects() metodunu kullanırız. Tek fark, verilerin bir dizi (array) içinde birden fazla dizi olarak tanımlanmasıdır:
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 mevcut tüm veriyi Algolia’ya aktarmak istediğinizde, veritabanına bağlanıp tüm kayıtları çekmeli ve ardından Algolia’ya göndermelisiniz. Büyük veri setleri için verileri küçük parçalara (chunk) bölerek göndermek daha verimli olacaktır:
$db = new PDO('mysql:host=localhost;dbname=TEST;charset=utf8', 'KADI', 'ŞİFRE');
try {
// mevcut indeksin içindeki verileri boşaltırız
$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();
}Verileri güncellemek için partialUpdateObject() ve partialUpdateObjects() metodları kullanılır. Bu metodlar, belirtilen objectID‘ye sahip verinin sadece gönderdiğiniz 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'
]
]);İndeks İçinde Arama ve Kriter Belirleme
Verilerimizi Algolia’ya aktardıktan sonra arama yapmak oldukça kolaydır. search() metodunu kullanarak indeksinizde arama yapabilirsiniz:
try {
$result = $index->search('İstanbul Ephesus Hotel');
print_r($result);
} catch (AlgoliaAlgoliaSearchExceptionsAlgoliaException $e) {
echo $e->getMessage();
}Bu metod, eşleşen sonuçları ve bu sonuçların hangi alanlarda, ne kadar eşleştiğini gösteren detaylı bir çıktı döndürür. Özellikle _highlightResult bölümü, arama terimlerinin hangi alanlarda bulunduğunu ve hatta <em></em> etiketleriyle vurgulanmış hallerini gösterir ki bu, ön yüz geliştirmede oldukça kullanışlıdır.
Arama işlemini belirli alanlarla kısıtlamak isterseniz, setSettings() metodu ile indeks ayarlarınızı güncelleyebilirsiniz. Örneğin, sadece otel adı, şehir ve bölge alanlarında arama yapmak için:
$index->setSettings([ 'searchableAttributes' => ['name', 'city', 'state'] ]);
Bu ayar sayesinde, arama artık sadece belirtilen bu üç alanda gerçekleşecek, diğer alanlardaki eşleşmeler dikkate alınmayacaktır.
Veri Silme
Algolia indeksinizden tek bir veriyi silmek için deleteObject(), birden fazla veriyi silmek için ise deleteObjects() metodlarını kullanırız. Silme işlemi objectID değerine göre yapılır:
$index->deleteObject("1");
$index->deleteObjects(["1", "2"]);Verileri Kategorize Etme (Facets)
Algolia’ya gönderdiğiniz verileri kategorilere ayırmak ve bu kategorilere göre filtreleme yapmak için Facet’ler kullanılır. Örneğin, otel indeksinizdeki verileri yıldıza, şehre veya bölgeye göre kategorize edebilirsiniz. Bunun için indeks ayarlarınızı aşağıdaki gibi güncellemeniz gerekir:
$index->setSettings([ 'attributesForFaceting' => ['city', 'state', 'star'] ]);
Bu ayar yapıldıktan sonra, arama yaparken belirli kategori filtrelerini uygulayabilirsiniz. Örneğin, “İstanbul” otellerini ararken sadece “Şişli” bölgesindeki 3 yıldızlı otelleri bulmak için:
$result = $index->search('İstanbul', [
'facetFilters' => [
'state:Şişli',
'star:3'
]
]);
print_r($result);InstantSearch.js ile Ön Yüz Entegrasyonu
Algolia, arama deneyimini ön yüzünüze kolayca entegre etmeniz için bir dizi widget’tan oluşan InstantSearch.js kütüphanesini sunar. Bu widget’lar sayesinde filtreleme ve listeleme işlemlerini hızlıca yapabilir, tasarımınıza uygun CSS değişiklikleriyle görünümü özelleştirebilirsiniz. Detaylı dökümanlara https://www.algolia.com/doc/api-reference/widgets/js/ adresinden ulaşabilirsiniz.
Ö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>Ardından gerekli JavaScript dosyalarını ve widget’ları ekleyelim. Client tarafında API Key yerine size verilen Search Only API Key‘i kullanmanız gerektiğini unutmayın; bu anahtar sadece arama işlemleri için güvenli bir şekilde kullanılabilir:
<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 için Algolia
Eğer web siteniz WordPress altyapısına sahipse, Algolia’yı entegre etmek daha da basittir. Mevcut Algolia eklentilerini kullanarak sitenizin standart arama özelliğini Algolia’nın üstün performansı ile değiştirebilirsiniz. Örneğin, ben erbilen.net’te “WP Search with Algolia” eklentisini kullanıyorum. Bu tür eklentiler, WordPress sitelerinizde hızlı bir test yapıp Algolia’nın farkını görmeniz için harika bir başlangıç noktasıdır.
Gelişmiş arama yetenekleri, inanılmaz hızı ve esnek entegrasyon seçenekleriyle Algolia, modern web uygulamaları için vazgeçilmez bir araç haline gelmiştir. Kullanıcılarınıza anında ve doğru sonuçlar sunarak onların deneyimini üst düzeye çıkarmak isteyen her geliştirici ve işletme için Algolia, sadece bir arama motoru olmaktan öte, güçlü bir kullanıcı etkileşim platformudur. Bu güçlü araçla tanışmak ve sunduğu sayısız özelliği keşfetmek, dijital ürünlerinizin geleceğini şekillendirme yolunda atacağınız en önemli adımlardan biri olacaktır.