Volltextsuche mit PostgreSQL#
Auch mit Postgres-Datenbanken kann man die internen Funktionen für eine Volltext-Suche nutzen.
Mit Postgres 8.x unter Debian scheint alles ohne weitere Installationsarbeiten zu funktionieren.
Grundlagen#
Die eingebauten Funktionen to_tsvector und to_tsquery kann man in einer leeren Datenbank ausprobieren:
database=> select to_tsvector('german','Hallo neue Zeit'); to_tsvector ---------------------------- 'hallo':1 'neu':2 'zeit':3 (1 Zeile)
Man sieht: die einzelnen Worte werden für die deutsche Sprache normalisiert, in diesem Beispiel wird aus neue das Stammwort neu.
database=> select to_tsquery('german', '(Haus|Auto)&kaufen'); to_tsquery ------------------------------ ( 'haus' | 'auto' ) & 'kauf' (1 Zeile)
ts_query analysiert und normalisiert Suchanfragen, hier wird gesucht nach Kauf und Haus oder Auto
Wie nutze ich das#
Ich lege mal eine Tabelle an und füge ein paar Zeilen ein:
database=> create table firma ( id int4, name varchar(64), geschfeld text ); database=> insert into firma values (1, 'Maler Meister', 'Farben und Tapeten, Anstrich außen und innen, Teppichboden'); database=> insert into firma values (2, 'Dachdecker Teer', 'Dachfenster, Dachgauben, Sturmschäden, Dämmung'); database=> insert into firma values (3, 'Schreiner Hobel', 'Tische und Schränke, Türen und Fenster, Küchen nach Maß'); database=> insert into firma values (4, 'Installateur Dicht', 'Küche und Bad, Wanne und WC, Dusche, Gas, Wasser, Heizung');
Dann kommt der Aufbau des Volltext-Index über zwei Spalten:
database=> alter table firma add column textindex tsvector; database=> update firma set textindex=to_tsvector('german', name || ' ' || geschfeld); database=> create index textindex_idx on firma using gist(textindex); database=> create trigger textsearchupdate before update or insert on firma for each row execute procedure tsvector_update_trigger(textindex, 'pg_catalog.german', name, geschfeld);
Der Trigger sorgt dafür, dass der Textindex bei Tabellen-Updates aktualisiert wird.
Erste Abfrage#
database=> select name from firma where textindex @@ to_tsquery('german', 'küche'); name -------------------- Schreiner Hobel Installateur Dicht (2 Zeilen) database=> select name from firma where textindex @@ to_tsquery('german', 'farbe'); name --------------- Maler Meister (1 Zeile)
Add new attachment
Only authorized users are allowed to upload new attachments.