Postgres में full-text search: Elasticsearch बनाम विकल्प
(blog.paradedb.com)full-text search
- full-text search वह तकनीक है जिसमें किसी टेक्स्ट संग्रह में खास keywords और phrases की मौजूदगी के आधार पर आइटम खोजे जाते हैं
- Elasticsearch जैसे अधिकांश search engines search results को rank करने के लिए BM25 algorithm का उपयोग करते हैं
- BM25 यह देखता है कि कोई term कितनी बार दिखाई देता है, और सभी documents में वह term कितना unique है
- full-text search, similarity search या vector search से अलग है, जो semantic meaning के आधार पर results खोजते और rank करते हैं
- कई आधुनिक applications full-text search और similarity search को मिलाकर उपयोग करती हैं; इसे hybrid search कहा जाता है, और इससे अधिक सटीक results मिल सकते हैं
Postgres FTS
फायदे
-
सरलता
- Postgres FTS के लिए अतिरिक्त infrastructure की ज़रूरत नहीं होती और इसे AWS RDS जैसी सभी managed Postgres services पर इस्तेमाल किया जा सकता है
- लंबी अवधि में external search engine को orchestrate और manage करने की ज़रूरत नहीं पड़ती, जिससे काफ़ी समय और मेहनत बच सकती है
-
रीयल-टाइम search
- Postgres FTS में commit होते ही data searchable हो जाता है
- यह user-facing search experience या latency-sensitive search experience बनाने वाली कंपनियों के लिए बहुत उपयोगी हो सकता है, जैसे e-commerce sites या fintech
-
Postgres transactions और MVCC
- Postgres के ACID transactions और multi-version concurrency control (MVCC) concurrent access और frequent updates के दौरान FTS results की reliability सुनिश्चित करते हैं
नुकसान
-
फीचर की अपूर्णता
- Postgres FTS का सीमित feature set कुछ कंपनियों के लिए deal-breaker हो सकता है
- जिन features की कमी है उनमें BM25 scoring, relevance tuning, custom tokenizers, faceting आदि शामिल हैं
-
बड़े data sets पर performance में गिरावट
- Postgres FTS लाखों rows वाली tables पर अच्छा काम करता है, लेकिन करोड़ों rows वाली tables पर performance काफ़ी घट जाती है
-
transaction overhead
- किसी column पर GIN index बनाने से उस column को प्रभावित करने वाले transactions में थोड़ी latency जुड़ जाती है, आमतौर पर milliseconds में
मुख्य सार
- Postgres FTS छोटे से मध्यम आकार की tables में search के लिए आदर्श है, जहाँ बहुत sophisticated FTS queries की ज़रूरत नहीं होती
- "मध्यम आकार" और "sophisticated" का अर्थ जानबूझकर अस्पष्ट रखा गया है, क्योंकि यह performance requirements पर निर्भर करता है
- अच्छी बात यह है कि Postgres FTS पर/से test और migration करना बहुत आसान है
Elasticsearch
फायदे
-
व्यापक feature set
- Elasticsearch लगभग हर तरह की FTS query को संभाल सकता है
- Elastic query DSL (domain-specific language) full-text search capabilities का मानक है
-
उच्च performance
- benchmarks के अनुसार Elasticsearch अपने default, battle-tested Lucene search engine और distributed architecture की वजह से अरबों rows पर milliseconds में query चला सकता है
-
search से आगे की क्षमताएँ
- FTS के अलावा Elasticsearch एक analytical query engine, vector database, security और observability platform भी है
- कई organizations Elasticsearch के भीतर कई services को consolidate करने की सरलता पसंद करती हैं
नुकसान
-
यह विश्वसनीय data store नहीं है
- कई कंपनियों ने Elasticsearch को primary data store के रूप में इस्तेमाल करने का फ़ैसला करने पर बाद में पछताया है
- यह अनुशंसित तरीका नहीं है। Elasticsearch में ACID transactions और MVCC नहीं होते, जिससे data inconsistency और loss हो सकता है, और relational properties व real-time consistency की कमी के कारण कई database queries कठिन हो जाती हैं
-
ETL pipeline की ज़रूरत
- क्योंकि Elasticsearch विश्वसनीय data store नहीं है, इसलिए आमतौर पर Postgres इस्तेमाल करने वाली organizations data को Postgres से Elasticsearch में extract, transform, और load (ETL) करती हैं
- ETL pipeline में failure कई तरह के production outages का कारण बन सकते हैं, इसलिए यह सावधानी से maintain करना पड़ता है कि base Postgres schema में बदलाव pipeline को न तोड़ें
-
data freshness का नुकसान
- ETL jobs समय लेने वाली होती हैं और समय-समय पर चलती हैं
- Elasticsearch तक पहुँचने वाला data अक्सर Postgres की तुलना में कई घंटे पीछे होता है
- Postgres tables पर real-time search करने वाले applications के लिए यह अस्वीकार्य हो सकता है
-
लागत
- यह सुनकर हैरानी होती है कि कई कंपनियों के लिए Elasticsearch सबसे बड़ा software cost item बन गया
- जैसे-जैसे Elasticsearch cluster की लागत बढ़ी, इनमें से कई कंपनियाँ Elasticsearch Cloud से self-managed setup पर गईं, जिससे cloud खर्च तो घटा लेकिन नई समस्याएँ पैदा हुईं
- Elasticsearch को operate, tune, और manage करना बेहद कठिन माना जाता है
- ये organizations Elasticsearch clusters को manage करने के लिए महँगे engineers तक hire करती हैं
मुख्य सार
- Elasticsearch बेहतरीन search performance देता है, लेकिन इसकी कीमत operational overhead और data freshness के समझौते के रूप में चुकानी पड़ती है
- यदि हल्के विकल्पों से काम न चले, या आप Elasticsearch की अन्य services भी उपयोग करने वाले हों, तो Elasticsearch की सिफारिश की जाती है
वैकल्पिक search engines
- पिछले कुछ वर्षों में Algolia, Meilisearch, और Typesense जैसे आधुनिक search engines उभरे हैं
- इन engines का उपयोग आमतौर पर user-facing search experience बनाने के लिए किया जाता है
- Hacker News search भी Algolia पर बना है
- हर service किनारों पर खुद को अलग दिखाती है, लेकिन Postgres पर search खोजने वाले developers के लिए एक महत्वपूर्ण चेतावनी है
- इनमें से कोई भी solution खास तौर पर Postgres के लिए नहीं बनाया गया है
- Postgres users को Elasticsearch की तरह इन services में भी समान समस्याएँ झेलनी पड़ सकती हैं
क्या दोनों दुनियाओं का श्रेष्ठ मिल सकता है?
- ParadeDB, Postgres के लिए बनाया गया एक full-text search engine है
pg_searchनाम के extension पर आधारित ParadeDB, Rust-आधारित Lucene alternative Tantivy को Postgres के भीतर embed करता है- Postgres FTS की तरह ParadeDB भी अतिरिक्त infrastructure के बिना मौजूदा self-managed Postgres database से जुड़ता है
- Elasticsearch की तरह ParadeDB उन्नत full-text search engine की capabilities प्रदान करता है
- Amazon RDS जैसी managed Postgres services के साथ compatibility जल्द आने वाली है
3 टिप्पणियां
मुझे अब पता चला कि Postgres FTS से मतलब उसकी built-in functionality था।
ये लोग इसे लगातार बेहतर बना रहे हैं और इससे जुड़े लेख पोस्ट कर रहे हैं, इसलिए इसे GeekNews पर भी कई बार साझा किया गया है.
ParadeDB - PostgreSQL for Search
pg_bm25 - Postgres में Elastic स्तर की गुणवत्ता देने वाला Full-Text search extension
लेख में जिन paradedb, pg_search, और pg_bm25 का उल्लेख है, वे सभी एक ही प्रोजेक्ट हैं।