Bir uygulamaya arama özelliği eklemeniz gerekiyor. LIKE sorgusu, PostgreSQL full-text search ve Elasticsearch arasında nasıl seçim yaparsınız?
Cevap
Seçim veri hacmi, arama kalitesi ihtiyacı (yazım hatası toleransı, ilgililik sıralaması, facet) ve operasyon maliyetine göre yapılır. Çoğu ürün için PostgreSQL full-text search iyi bir başlangıçtır; ihtiyaç büyüyünce ayrı bir arama motoruna geçilir.
| Yöntem | Artı | Eksi | Uygun durum |
|---|---|---|---|
LIKE '%kelime%' | Basit, ek altyapı yok | Index kullanamaz, büyük tabloda yavaş, sıralama yok | Küçük tablolar, admin paneli |
PostgreSQL FTS (tsvector) | Index'li, kök bulma, sıralama, ek servis yok | Fuzzy ve facet sınırlı, karmaşık ilgililik zor | Orta ölçek, tek DB |
pg_trgm | Benzerlik ve yazım hatası toleransı, ILIKE hızlanır | Büyük metinlerde index büyük | İsim, ürün adı araması |
| Elasticsearch / OpenSearch | Fuzzy, facet, ilgililik, ölçek | Ayrı küme, senkronizasyon, operasyon yükü | Büyük katalog, e-ticaret, log arama |
| Meilisearch / Typesense | Kurulumu kolay, typo toleransı | Çok büyük veri ve karmaşık sorgularda sınırlı | Site içi arama, orta ölçek |
PostgreSQL FTS örneği
ALTER TABLE products ADD COLUMN search tsvector
GENERATED ALWAYS AS (to_tsvector('turkish', coalesce(name,'') || ' ' || coalesce(description,''))) STORED;
CREATE INDEX products_search_idx ON products USING GIN (search);
SELECT id, name, ts_rank(search, q) AS rank
FROM products, websearch_to_tsquery('turkish', 'kablosuz kulaklık') q
WHERE search @@ q
ORDER BY rank DESC LIMIT 20;Ayrı arama motoru kullanılırsa
- Kaynak veri (source of truth) yine veritabanıdır; arama indeksi türetilmiş bir kopyadır.
- Senkronizasyon: uygulama içinden çift yazma (basit ama tutarsızlık riski), outbox + kuyruk veya CDC (Debezium) ile değişikliklerin indekse akması.
- İndeks tamamen yeniden oluşturulabilir olmalı (yeni mapping için alias ile sıfır kesintili reindex).
- Yetki kontrolü: arama sonuçları kullanıcının göremeyeceği kayıtları içermemeli; tenant/izin filtresi sorguya eklenmeli.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.