- Moderatör
- #1
- Kayıtlı
- 1 Yıl 9 Ay 26 Gün
- Katılım
- 10 Ocak 2025
- Konular
- 163
- Mesajlar
- 257
- Tepkime puanı
- 36
- Online süresi
- 11h 19m
- Puan
- 53
- Konum
- Türkiye
- Web sitesi
- www.zyncra.shop
Konu İçeriği — Hızlı Bakış (
cPanel / Web • ⏱ ~4 dk okuma •
Kod: JavaScript)
01. Neden Ayrı Bir Arama Motoru?
02. Docker ile Kurulum
03. API Anahtarlarını Doğru Kullanmak
04. Node.js İstemcisini Hazırlamak
05. Dizin Oluşturup Belge Eklemek
06. Arama ve Yazım Hatası Toleransı
Neden Ayrı Bir Arama Motoru?
Sitenizdeki arama kutusu büyük ihtimalle veritabanında LIKE sorgusu çalıştırıyor. Bu yöntem küçük tablolarda iş görse de içerik büyüdükçe yavaşlıyor, üstelik ziyaretçinin yaptığı en küçük yazım hatasında boş sonuç dönüyor. "Zelda" yerine "Zleda" yazan biri hiçbir şey bulamıyor ve çoğu zaman siteden çıkıp gidiyor.
Meilisearch bu sorunu çözmek için yazılmış, Rust tabanlı ve açık kaynaklı bir arama motoru. Yazım hatalarını tolere ediyor, sonuçları genellikle 50 milisaniyenin altında döndürüyor ve kurulduğu anda makul ayarlarla çalışıyor. Basit bir REST API sunduğu için hangi dille yazdığınız fark etmiyor; isterseniz kendi sunucunuza kuruyor, isterseniz bulut sürümünü kullanıyorsunuz.
Docker ile Kurulum
Tek bir komutla çalıştırmak mümkün:
Bash:
docker run -d --name meilisearch \
-p 7700:7700 \
-e MEILI_ENV=production \
-e MEILI_MASTER_KEY=en-az-16-karakterlik-gizli-anahtar \
-v meili_data:/meili_data \
getmeili/meilisearch:latestMEILI_ENV değerini production yaptığınızda ana anahtar zorunlu hale geliyor ve en az 16 bayt uzunluğunda olmalı. Geliştirme ortamında bu değeri development yaparsanız tarayıcıdan 7700 portuna girerek denemeler yapabileceğiniz küçük bir arama arayüzü açılıyor. Verileri meili_data adlı kalıcı bir Docker birimine bağlamak da önemli; aksi halde konteyner silindiğinde bütün dizinler gidiyor. Canlı kullanımda sürüm etiketini latest yerine sabit bir sürüme bağlamanızı öneririm.
API Anahtarlarını Doğru Kullanmak
Ana anahtar yalnızca yönetim içindir ve hiçbir zaman kodunuza girmemeli. Meilisearch ilk açılışta iki hazır anahtar daha üretiyor: Default Search API Key ve Default Admin API Key. Bunları ana anahtarla anahtar listesini sorgulayarak görebilirsiniz. Arama anahtarı yalnızca arama yapabildiği için sitenin ön yüzünde rahatça kullanılabilir. Belge ekleyip silen yönetim anahtarı ise yalnızca sunucu tarafında, ortam değişkeni olarak durmalı.
Node.js İstemcisini Hazırlamak
Meilisearch'e her dilden basit HTTP istekleriyle ulaşılabiliyor ama resmî JavaScript istemcisi işi iyice kolaylaştırıyor. Proje klasöründe npm install meilisearch komutunu çalıştırdıktan sonra istemciyi şöyle oluşturuyoruz:
JavaScript:
import { MeiliSearch } from "meilisearch";
const istemci = new MeiliSearch({
host: "http://localhost:7700",
apiKey: "YONETIM_ANAHTARI",
});
const oyunlar = istemci.index("oyunlar");Örnekte adresi ve anahtarı okunaklı olsun diye doğrudan yazdım. Gerçek projede bu iki değeri ortam değişkenlerinden okumanız daha doğru olur. Belge ekleyen ve ayar değiştiren bu istemci yönetim anahtarıyla çalıştığı için yalnızca sunucu tarafında durmalı.
Dizin Oluşturup Belge Eklemek
Meilisearch'te veriler dizinlerde tutuluyor; dizinin içindeki her kayda belge deniyor. Örnek olarak bir oyun kataloğu oluşturalım. Dizini ayrıca oluşturmanıza gerek yok, ilk belgeleri gönderdiğinizde kendiliğinden açılıyor:
JavaScript:
await oyunlar.addDocuments([
{ id: 1, ad: "The Legend of Zelda: Breath of the Wild", tur: "Aksiyon", yil: 2017 },
{ id: 2, ad: "Elden Ring", tur: "RPG", yil: 2022 },
{ id: 3, ad: "Stardew Valley", tur: "Simülasyon", yil: 2016 },
]);Her belgede benzersiz bir birincil anahtar olmalı; burada bu görevi id alanı üstleniyor. Ekleme işlemleri sıraya alınıyor ve yanıtta bir görev numarası dönüyor. Binlerce belgeyi tek seferde göndermek sorun değil, Meilisearch bunları arka planda işliyor. Aynı id ile yeniden gönderdiğiniz belge eskisinin üzerine yazılıyor.
Arama ve Yazım Hatası Toleransı
Şimdi bilerek hatalı yazalım:
JavaScript:
const sonuc = await oyunlar.search("zleda breth");
console.log(sonuc.hits);Sonuçta Zelda yine ilk sırada geliyor. Varsayılan ayarlarda beş harf ve üzeri kelimelerde bir, dokuz harf ve üzeri kelimelerde iki harf hatasına izin veriliyor. Kısa kelimelerde ise hata kabul edilmiyor; bu da alakasız sonuçların önüne geçiyor.
Filtreleme ve Sıralama
Tür ya da yıl gibi alanlara göre filtre uygulamak için önce bu alanları ayarlardan tanıtmanız gerekiyor:
JavaScript:
await oyunlar.updateSettings({
searchableAttributes: ["ad", "tur"],
filterableAttributes: ["tur", "yil"],
sortableAttributes: ["yil"],
});
const yeniler = await oyunlar.search("eldn", {
filter: "yil > 2020",
sort: ["yil:desc"],
limit: 10,
});Bundan sonra aramaya filter ile tür ve yıl koşulları, sort ile de sıralama ekleyebiliyorsunuz. Birden fazla koşulu tek filtrede birleştirmek de mümkün. searchableAttributes listesindeki sıra da önemli; önce yazılan alanda eşleşen sonuçlar daha üstte çıkıyor.
Ön Yüzde Arama Kutusu
Sitenin ön yüzünde ayrı bir istemci açıp bu kez yalnızca arama anahtarını kullanın. Yazdıkça sonuç gösteren bir arama kutusu istiyorsanız Algolia'nın InstantSearch kütüphanesini Meilisearch'e bağlayan instant-meilisearch paketine göz atın. Hazır bileşenlerle birkaç saatte şık bir arama sayfası çıkarabiliyorsunuz.
Sonuç
Meilisearch, Elasticsearch gibi ağır sistemlerin kurulum ve bakım yükü olmadan hızlı ve hataya dayanıklı bir arama deneyimi sunuyor. Veritabanınız asıl veri kaynağı olarak kalıyor, Meilisearch ise yalnızca aranacak alanların bir kopyasını tutuyor. Kayıt eklendiğinde ya da güncellendiğinde dizini de güncellemeyi unutmazsanız ziyaretçileriniz aradıklarını ilk denemede bulacak.
Özet Değerlendirme: Neden Ayrı Bir Arama Motoru? Sitenizdeki arama kutusu büyük ihtimalle veritabanında LIKE sorgusu çalıştırıyor. Bu yöntem küçük tablolarda iş görse de içerik büyüdükçe yavaşlıyor, üstelik ziyaretçinin yaptığı en küçük yazım hatasında boş sonuç dönüyor. "Zelda" yerine ...
Sıkça Sorulan Sorular (SSS)
Soru 1: Paylaşılan JavaScript örneği canlı (production) ortamda kullanılabilir mi?
Evet. Konudaki kod bloğu bellek güvenliği, hata yakalama ve performans kriterleri gözetilerek hazırlanmıştır; kendi proje mimarinize uyarlayarak doğrudan kullanabilirsiniz.
Soru 2: Meilisearch ile Sitene Hızlı ve Yazım Hatasına Dayanıklı Arama Motoru Eklemek uygulamasında en sık yapılan hata nedir?
Girdi doğrulamasını (validation) ve zaman aşımı/kaynak sınırlarını varsayılan değerlerde bırakmaktır. Rehberdeki yapılandırma adımlarını eksiksiz uygulayarak olası darboğazları önleyebilirsiniz.
Evet. Konudaki kod bloğu bellek güvenliği, hata yakalama ve performans kriterleri gözetilerek hazırlanmıştır; kendi proje mimarinize uyarlayarak doğrudan kullanabilirsiniz.
Soru 2: Meilisearch ile Sitene Hızlı ve Yazım Hatasına Dayanıklı Arama Motoru Eklemek uygulamasında en sık yapılan hata nedir?
Girdi doğrulamasını (validation) ve zaman aşımı/kaynak sınırlarını varsayılan değerlerde bırakmaktır. Rehberdeki yapılandırma adımlarını eksiksiz uygulayarak olası darboğazları önleyebilirsiniz.

