!!!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)

}}}

[{Tag Datenbank}]