Database Reference
In-Depth Information
SELECT
ts
_
lexize(
'english
_
stem'
,
'Day''s'
);
ts
_
lexize
-----------
{day}
Die Volltextsuche funktioniert natürlich auch in anderen Sprachen. Wenn
Sie Deutsch installiert haben, probieren Sie Folgendes:
SELECT
to
_
tsvector(
'german'
,
'was machst du gerade?'
);
to
_
tsvector
--------------------
'gerad':4 'mach':2
Da
was
und
du
gängig sind, werden sie im deutschen Wörterbuch als Stopp-
wörter markiert, während
machst
und
gerade
abgeleitet werden.
Lexeme indexieren
Die Volltextsuche ist sehr leistungsfähig. Doch wenn wir unsere Tabellen
nicht indexieren, ist sie auch langsam. Der
EXPLAIN
-Befehl ist ein mächti-
ges Werkzeug, wenn man sich ansehen möchte, wie Queries intern geplant
werden.
EXPLAIN
SELECT
*
FROM
movies
WHERE
title @@
'night & day'
;
QUERY PLAN
---------------------------------------------------------------------------
Seq Scan on movies (cost=10000000000.00..10000000001.12 rows=1 width=68)
Filter: (title @@ 'night & day'::text)
Beachten Sie die Zeile
Seq Scan on movies
. Das ist bei einer Query nur selten
ein gutes Zeichen, denn es bedeutet, dass die gesamte Tabelle abgesucht
wird, d. h., jede Zeile wird gelesen. Wir brauchen also einen Index.
Wir nutzen Generalized Inverted iNdex (GIN) - wie GIST eine Index-API - ,
um einen Index der Lexeme aufzubauen, um schnelle Queries zu ermögli-
chen. Der Begriff
invertierter Index
wird Ihnen bekannt vorkommen, wenn
Sie schon einmal mit Suchmaschinen wie Lucene oder Sphinx gearbeitet ha-
ben. Diese Datenstruktur ist zur Indexierung bei Volltextsuchen üblich.
CREATE INDEX
movies
_
title
_
searchable
ON
movies
USING
gin(to
_
tsvector(
'english'
, title));