PostgreSQL kann Text in Suchbegriffe zerlegen und passende Dokumente innerhalb einer SQL-Abfrage finden. Eine gute Suche benötigt neben der technischen Abfrage eine passende Sprachkonfiguration und Testfragen aus Ihrem Bestand. Sie sollten vorher festlegen, welche Inhalte durchsuchbar sein sollen und wer sie sehen darf.
Suchvektoren aus dem Text erzeugen
tsvector speichert die aufbereiteten Suchbegriffe, tsquery beschreibt die Anfrage. Das Beispiel legt eine Tabelle für Dokumente an und berechnet den Vektor mit der deutschen Konfiguration. Es ist für eine Testdatenbank gedacht.
-- Erstellung einer Tabelle mit TSVECTOR Spalte
CREATE TABLE dokumente (
id SERIAL PRIMARY KEY,
text TEXT,
textsearchable_index_col TSVECTOR
);
-- Aktualisierung der textsearchable_index_col mit dem TSVECTOR des Texts
UPDATE dokumente SET textsearchable_index_col = to_tsvector('german', text);
Der gezeigte Update-Schritt berücksichtigt nur die Daten zum Ausführungszeitpunkt. Später eingefügte oder geänderte Texte benötigen ebenfalls einen aktuellen Suchvektor. Entscheiden Sie, ob dies durch eine erzeugte Spalte, einen Trigger oder einen zuverlässig ausgeführten Anwendungsschritt geschieht. Prüfen Sie diesen Ablauf auch bei Importen und Massenänderungen.
Treffer auswählen und ordnen
Ranking-Funktionen ordnen passende Ergebnisse nach einem berechneten Gewicht. Die Gewichtung im Beispiel ist eine mögliche Konfiguration, kein allgemeiner Qualitätsmaßstab. Ein hoher Rang belegt weder die Richtigkeit eines Dokuments noch seine fachliche Bedeutung.
-- Hinzufügen einer Gewichtung zum TSVECTOR
UPDATE dokumente SET textsearchable_index_col = setweight(to_tsvector('german', text), 'A');
-- Suche mit Ranking
SELECT id, text, ts_rank_cd(textsearchable_index_col, query) AS rank
FROM dokumente, to_tsquery('german', 'Suchbegriff') query
WHERE query @@ textsearchable_index_col
ORDER BY rank DESC;
Für freie Nutzereingaben ist eine geeignete Query-Funktion zu wählen; die Syntax von to_tsquery() verlangt besondere Beachtung. Nutzen Sie parametrisierte Abfragen. Beschränken Sie die Suche außerdem auf die Dokumente, die der Benutzer lesen darf.
Index und Suchqualität getrennt prüfen
Ein passender GIN-Index kann die Suche unterstützen. Seine Wirkung hängt von den Daten und der Abfrage ab. Testen Sie Fachbegriffe, Schreibvarianten und leere Ergebnisse. Synonyme entstehen nicht automatisch durch das Ranking; sie benötigen eine passende Suchkonfiguration oder eine eigene Verarbeitung.
Bewerten Sie die Treffer anhand Ihrer konkreten Fragen. Diese fachliche Prüfung und die Laufzeitmessung beantworten unterschiedliche Fragen und sollten beide zur Freigabe gehören.
Weiterführende Dokumentation: PostgreSQL: Full Text Search.