Volltextsuche in Postgres: Elasticsearch vs. Alternativen
(blog.paradedb.com)Volltextsuche (Full Text Search)
- Volltextsuche ist eine Technik, um in einer Textsammlung Einträge anhand des Vorkommens bestimmter Keywords und Phrasen zu finden
- Die meisten Suchmaschinen wie Elasticsearch verwenden den BM25-Algorithmus, um Suchergebnisse zu bewerten
- BM25 berücksichtigt, wie häufig ein Begriff vorkommt und wie einzigartig dieser Begriff über alle Dokumente hinweg ist
- Volltextsuche unterscheidet sich von Ähnlichkeitssuche oder Vektorsuche, die Ergebnisse anhand semantischer Bedeutung finden und ranken
- Viele moderne Anwendungen kombinieren Volltextsuche und Ähnlichkeitssuche; das wird als Hybrid Search bezeichnet und kann zu präziseren Ergebnissen führen
Postgres FTS
Vorteile
-
Einfachheit
- Postgres FTS benötigt keine zusätzliche Infrastruktur und kann auf allen verwalteten Postgres-Diensten wie AWS RDS verwendet werden
- Langfristig spart das erheblich Zeit und Aufwand, da kein externer Such-Engine-Stack orchestriert und verwaltet werden muss
-
Echtzeitsuche
- Mit Postgres FTS können Daten sofort nach dem Commit durchsucht werden
- Das kann für Unternehmen, die Sucherlebnisse für Endnutzer oder latenzsensible Sucherlebnisse aufbauen, sehr nützlich sein, etwa für E-Commerce-Seiten oder FinTechs
-
Postgres-Transaktionen und MVCC
- Die ACID-Transaktionen und die Multiversion Concurrency Control (MVCC) von Postgres gewährleisten die Zuverlässigkeit von FTS-Ergebnissen bei gleichzeitigem Zugriff und häufigen Updates
Nachteile
-
Unvollständiger Funktionsumfang
- Der begrenzte Funktionsumfang von Postgres FTS kann für manche Unternehmen ein Ausschlusskriterium sein
- Fehlende Funktionen sind unter anderem BM25-Scoring, Relevanz-Tuning, benutzerdefinierte Tokenizer und Facettierung
-
Schlechtere Performance bei großen Datensätzen
- Postgres FTS funktioniert gut bei Tabellen mit Millionen von Zeilen, die Performance fällt jedoch bei Tabellen mit zig Millionen Zeilen deutlich ab
-
Transaktions-Overhead
- Das Erstellen eines GIN-Index auf einer Spalte fügt Transaktionen, die diese Spalte betreffen, etwas Latenz hinzu, in der Regel im Millisekundenbereich
Kernaussagen
- Postgres FTS ist ideal für die Suche in kleinen bis mittelgroßen Tabellen, wenn keine ausgefeilten FTS-Abfragen benötigt werden
- Was genau „mittelgroß“ und „ausgefeilt“ bedeutet, bleibt absichtlich vage, da es von den Performance-Anforderungen abhängt
- Glücklicherweise sind Tests mit Postgres FTS sowie Migrationen zu oder von Postgres FTS sehr einfach
Elasticsearch
Vorteile
-
Umfassender Funktionsumfang
- Elasticsearch kann nahezu jede FTS-Abfrage verarbeiten
- Die Elastic Query DSL (Domain Specific Language) ist der Standard für Volltextsuchfunktionen
-
Hohe Performance
- Benchmarks zufolge kann Elasticsearch dank der battle-tested Lucene-Suchmaschine im Kern und seiner verteilten Architektur Milliarden von Zeilen in Millisekunden abfragen
-
Mehr als nur Suche
- Neben FTS ist Elasticsearch auch eine analytische Query Engine, eine Vektordatenbank sowie eine Plattform für Sicherheit und Observability
- Viele Organisationen schätzen die Einfachheit, mehrere Dienste innerhalb von Elasticsearch zu konsolidieren
Nachteile
-
Kein verlässlicher Datenspeicher
- Viele Unternehmen haben es später bereut, Elasticsearch als primären Datenspeicher zu verwenden
- Das ist kein empfohlener Ansatz. Elasticsearch fehlen ACID-Transaktionen und MVCC, was zu Dateninkonsistenzen und Datenverlust führen kann; zudem fehlen relationale Eigenschaften und Echtzeitkonsistenz, wodurch viele Datenbankabfragen schwierig werden
-
ETL-Pipeline erforderlich
- Da Elasticsearch kein verlässlicher Datenspeicher ist, extrahieren, transformieren und laden Organisationen, die Postgres verwenden, ihre Daten in der Regel von Postgres nach Elasticsearch (ETL)
- Änderungen am zugrunde liegenden Postgres-Schema müssen sorgfältig gepflegt werden, damit die Pipeline nicht beschädigt wird, denn Ausfälle in der ETL-Pipeline können zu allen Arten von Produktionsstörungen führen
-
Verlust an Datenaktualität
- ETL-Jobs sind zeitaufwendig und laufen periodisch
- Daten, die Elasticsearch erreichen, sind oft um Stunden hinter Postgres zurück
- Für Anwendungen, die Echtzeitsuche über Postgres-Tabellen durchführen, kann das ein Ausschlusskriterium sein
-
Kosten
- Es ist überraschend, wie oft Unternehmen berichten, dass Elasticsearch ihr größter Software-Kostenfaktor geworden ist
- Als die Kosten für Elasticsearch-Cluster explodierten, wechselten viele dieser Unternehmen von Elasticsearch Cloud zu Self-Hosting, was zwar die Cloud-Ausgaben senkte, aber neue Probleme verursachte
- Elasticsearch gilt als notorisch schwer zu betreiben, zu tunen und zu verwalten
- Diese Organisationen stellen teure Engineers ein, um ihre Elasticsearch-Cluster zu verwalten
Kernaussagen
- Elasticsearch bietet hervorragende Such-Performance auf Kosten von Betriebsaufwand und Datenaktualität
- Elasticsearch ist zu empfehlen, wenn leichtere Alternativen nicht ausreichen oder ohnehin andere Elasticsearch-Dienste genutzt werden sollen
Alternative Suchmaschinen
- In den vergangenen Jahren sind moderne Suchmaschinen wie Algolia, Meilisearch und Typesense entstanden
- Diese Engines werden typischerweise genutzt, um Sucherlebnisse für Endnutzer aufzubauen
- Auch die Hacker-News-Suche basiert auf Algolia
- Jeder Dienst unterscheidet sich in Details, aber für Entwickler, die Suche für Postgres suchen, gibt es einen wichtigen Vorbehalt
- Keine dieser Lösungen wurde speziell für Postgres entwickelt
- Postgres-Nutzer werden bei diesen Diensten voraussichtlich ähnliche Probleme erleben wie bei Elasticsearch
Ist das Beste aus beiden Welten möglich?
- ParadeDB ist eine für Postgres entwickelte Volltextsuchmaschine
- Basierend auf einer Erweiterung namens
pg_searchbettet ParadeDB mit Tantivy eine in Rust geschriebene Lucene-Alternative direkt in Postgres ein - Wie Postgres FTS verbindet sich ParadeDB mit bestehenden selbstverwalteten Postgres-Datenbanken, ohne zusätzliche Infrastruktur zu benötigen
- Wie Elasticsearch bietet ParadeDB die Funktionen einer fortschrittlichen Volltextsuchmaschine
- Die Kompatibilität mit verwalteten Postgres-Diensten wie Amazon RDS soll in Kürze verfügbar sein
3 Kommentare
Ich habe mich gefragt, was Postgres FTS eigentlich ist, und jetzt ist mir klar, dass damit die eingebaute Funktion gemeint war.
Diese Leute verbessern das kontinuierlich und veröffentlichen dazu passende Beiträge, deshalb wurde es auch auf GeekNews schon mehrfach geteilt.
ParadeDB - PostgreSQL for Search
pg_bm25 - Full-Text-Sucherweiterung für Postgres, die Qualität auf Elastic-Niveau bietet
Die im Artikel erwähnten
paradedb,pg_searchundpg_bm25sind alle dasselbe Projekt.