This page (revision-2) was last changed on 22-Feb-2011 15:40 by Peter Hormanns 

This page was created on 22-Feb-2011 15:34 by Peter Hormanns

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
2 22-Feb-2011 15:40 2 KB Peter Hormanns to previous Volltextsuche mit Postgres
1 22-Feb-2011 15:34 2 KB Peter Hormanns to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

!!!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,(1,>> 'Dachdecker Teer', 'Dachfenster, Dachgauben, Sturmschäden, Dämmung');
database=> insert into firma values <<(3,(1,>> 'Schreiner Hobel', 'Tische und Schränke, Türen und Fenster, Küchen nach Maß');
database=> insert into firma values <<(4,(1, '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}]