Postgres'ta tam metin arama: Elasticsearch ve alternatifleri
(blog.paradedb.com)Tam metin arama (Full Text Search)
- Tam metin arama, belirli anahtar kelimelerin ve ifadelerin varlığına göre bir metin koleksiyonundaki öğeleri bulma tekniğidir
- Elasticsearch gibi çoğu arama motoru, arama sonuçlarını sıralamak için BM25 algoritmasını kullanır
- BM25, bir terimin ne kadar sık göründüğünü ve tüm belgeler arasında ne kadar ayırt edici olduğunu dikkate alır
- Tam metin arama, sonuçları anlamsal benzerliğe göre bulan ve sıralayan benzerlik araması veya vektör aramasından farklıdır
- Birçok modern uygulama, daha doğru sonuçlar elde etmek için tam metin arama ile benzerlik aramasını birleştirir; buna hibrit arama denir
Postgres FTS
Avantajlar
-
Basitlik
- Postgres FTS ek altyapı gerektirmez ve AWS RDS gibi tüm yönetilen Postgres servislerinde kullanılabilir
- Uzun vadede harici bir arama motorunu orkestre etme ve yönetme ihtiyacını ortadan kaldırarak ciddi zaman ve emek tasarrufu sağlar
-
Gerçek zamanlı arama
- Postgres FTS'te veriler commit edilir edilmez aranabilir hale gelir
- Bu, kullanıcıya dönük arama deneyimleri veya gecikmeye duyarlı arama deneyimleri geliştiren şirketler için (ör. e-ticaret siteleri veya fintech) çok faydalı olabilir
-
Postgres işlemleri ve MVCC
- Postgres'in ACID işlemleri ve çok sürümlü eşzamanlılık denetimi (MVCC), eşzamanlı erişim ve sık güncellemeler sırasında FTS sonuçlarının güvenilirliğini sağlar
Dezavantajlar
-
Eksik özellik seti
- Postgres FTS'in sınırlı özellik seti bazı şirketler için oyunu bozan bir unsur olabilir
- Eksik özellikler arasında BM25 skorlaması, alaka düzeyi ayarı, özel tokenizer'lar ve faceting yer alır
-
Büyük veri kümelerinde performans düşüşü
- Postgres FTS, milyonlarca satır içeren tablolarda iyi çalışsa da onlarca milyon satırlı tablolarda performans belirgin şekilde düşer
-
İşlem ek yükü
- Bir kolonda GIN indeks oluşturmak, o kolonu etkileyen işlemlere az da olsa gecikme (genellikle milisaniyeler) ekler
Temel özet
- Postgres FTS, gelişmiş FTS sorguları gerektirmeyen küçük ve orta ölçekli tablo aramaları için idealdir
- "Orta ölçekli" ve "gelişmiş" terimleri bilinçli olarak muğlak bırakılmıştır, çünkü bunların anlamı performans gereksinimlerine göre değişir
- Neyse ki Postgres FTS'e geçiş yapmak veya Postgres FTS'ten taşınmak oldukça kolaydır
Elasticsearch
Avantajlar
-
Kapsamlı özellik seti
- Elasticsearch neredeyse her türlü FTS sorgusunu işleyebilir
- Elastic query DSL (alan özel dil), tam metin arama özellikleri için standarttır
-
Yüksek performans
- Benchmark'lara göre Elasticsearch, battle-tested Lucene arama motoru ve dağıtık mimarisi sayesinde milyarlarca satırı milisaniye düzeyinde sorgulayabilir
-
Aramanın ötesinde özellikler
- FTS'in yanı sıra Elasticsearch bir analitik sorgu motoru, vektör veritabanı, güvenlik ve gözlemlenebilirlik platformudur
- Birçok kuruluş, birden fazla servisi Elasticsearch içinde birleştirmenin sağladığı sadeliği tercih eder
Dezavantajlar
-
Güvenilir bir veri deposu değildir
- Pek çok şirket, Elasticsearch'ü birincil veri deposu olarak kullanma kararından sonradan pişman olmuştur
- Bu önerilen bir yaklaşım değildir. Elasticsearch'te ACID işlemleri ve MVCC bulunmadığından veri tutarsızlığı ve kaybı yaşanabilir; ayrıca ilişkisel özelliklerin ve gerçek zamanlı tutarlılığın eksikliği birçok veritabanı sorgusunu zorlaştırır
-
ETL hattı gerektirir
- Elasticsearch güvenilir bir veri deposu olmadığından, Postgres kullanan kuruluşlar genellikle veriyi Postgres'ten Elasticsearch'e extract, transform, load (ETL) süreciyle taşır
- ETL hattındaki arızalar her türlü prodüksiyon kesintisine yol açabileceğinden, temel Postgres şemasındaki değişikliklerin hattı bozmaması için dikkatli bakım gerekir
-
Veri tazeliği kaybı
- ETL işleri zaman alır ve periyodik olarak çalıştırılır
- Elasticsearch'e ulaşan veri çoğu zaman Postgres'tekinden saatlerce geridedir
- Postgres tablolarında gerçek zamanlı arama yapan uygulamalar için bu kabul edilemez olabilir
-
Maliyet
- Birçok şirketten Elasticsearch'ün en büyük yazılım gider kalemi haline geldiğini duymak şaşırtıcıdır
- Elasticsearch cluster maliyetleri arttıkça bu şirketlerin birçoğu Elasticsearch Cloud'dan self-hosted yapıya geçti; bu bulut harcamalarını azalttı ama yeni sorunlar doğurdu
- Elasticsearch'ün işletimi, ayarlanması ve yönetimi son derece zordur ve bununla ün salmıştır
- Bu kuruluşlar, Elasticsearch cluster'larını yönetmek için pahalı mühendisler istihdam eder
Temel özet
- Elasticsearch, operasyonel ek yük ve veri tazeliği pahasına üstün arama performansı sunar
- Daha hafif alternatiflerle bunun mümkün olmadığı veya diğer Elasticsearch servislerini de kullanmayı planladığınız durumlarda Elasticsearch önerilir
Alternatif arama motorları
- Son birkaç yılda Algolia, Meilisearch ve Typesense gibi modern arama motorları ortaya çıktı
- Bu motorlar genellikle kullanıcıya dönük arama deneyimleri oluşturmak için kullanılır
- Hacker News araması da Algolia üzerine kuruludur
- Her servis farklı uç noktalarda ayrışsa da Postgres üzerinde arama arayan geliştiriciler için önemli bir uyarı vardır
- Bu çözümlerin hiçbiri Postgres için özel olarak geliştirilmemiştir
- Postgres kullanıcıları, Elasticsearch'te olduğu gibi bu servislerde de benzer sorunlar yaşama eğilimindedir
İki dünyanın en iyisi mümkün mü?
- ParadeDB, Postgres için geliştirilmiş bir tam metin arama motorudur
pg_searchadlı bir extension üzerine kurulan ParadeDB, Rust tabanlı Lucene alternatifi Tantivy'yi Postgres'in içine gömer- Postgres FTS gibi ParadeDB de ek altyapı gerektirmeden mevcut self-hosted Postgres veritabanına bağlanır
- Elasticsearch gibi ParadeDB de gelişmiş bir tam metin arama motorunun özelliklerini sunar
- Amazon RDS gibi yönetilen Postgres servisleriyle uyumluluk yakında gelecektir
3 yorum
Postgres FTS'in ne olduğunu merak ediyordum; meğer yerleşik bir özellikten bahsediyormuş.
Bu ekip sürekli iyileştirmeler yapıp ilgili yazılar paylaştığı için GeekNews'te de birkaç kez paylaşmıştım.
ParadeDB - Search için PostgreSQL
pg_bm25 - Postgres'te Elastic seviyesinde kalite sunan tam metin arama eklentisi
Yazıda bahsedilen
paradedb,pg_searchvepg_bm25aslında aynı projedir.