Database Reference
In-Depth Information
Nachdem wir den Index erzeugt haben, führen wir die Suche erneut aus.
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)
Was ist passiert? Nichts. Der Index ist da, aber Postgres nutzt ihn nicht.
Das liegt daran, dass unser GIN-Index gezielt die
english
-Konfiguration zum
Aufbau der
tsvector
en nutzt, während wir diesen Vektor nicht angeben. Wir
müssen ihn in der
WHERE
-Klausel der Query explizit angeben.
EXPLAIN
SELECT
*
FROM
movies
WHERE
to
_
tsvector(
'english'
,title) @@
'night & day'
;
QUERY PLAN
------------------------------------------------------------------------------------
Bitmap Heap Scan
on
movies (cost=4.26..8.28 rows=1 width=68)
Recheck Cond: (to
_
tsvector(
'english'
::regconfig, title) @@
'''day'''
::tsquery)
-> Bitmap
Index
Scan
on
movies
_
title
_
searchable (cost=0.00..4.26 rows=1 width=0)
Index
Cond: (to
_
tsvector(
'english'
::regconfig, title) @@
'''day'''
::tsquery)
EXPLAIN
ist wichtig, um sicherzustellen, dass Indizes so genutzt werden, wie
Sie es erwarten. Anderenfalls ist der Index nur unnötiger Overhead.
Metaphone
Wir haben uns in Richtung weniger spezifischer Eingaben bewegt. Bei
LIKE
und regulären Ausdrücken müssen Sie Muster angeben, die die Strings ent-
sprechend ihrem Format genau beschreiben. Die Levenshtein-Distanz findet
Treffer mit kleineren Schreibfehlern, doch letztlich muss man recht nah am
gesuchten String sein. Trigramme sind eine gute Wahl für akzetabel falsch
geschriebene Wörter. Die Volltextsuche erlaubt schließlich eine natürliche
sprachliche Flexibilität, indem sie z. B. englische Wörter wie
a
und
the
igno-
riert und mit der Pluralisierung umgehen kann. Manchmal wissen wir nicht,
wie man ein Wort richtig schreibt, doch wir wissen, wie man es spricht.
Wir lieben Bruce Willis und wollen wissen, in welchen Filmen er mitgespielt
hat. Unglücklicherweise können wir uns nicht genau daran erinnert, wie man
seinen Namen schreibt, weshalb wir ihn so schreiben, wie es sich in etwa
anhört.