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)

Tags:  Datenbank

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-2) was last changed on 22-Feb-2011 15:40 by Peter Hormanns