FTS unterstützt nicht LIKE
Die zuvor akzeptierte Antwort war falsch. Die Volltextsuche mit ihren Volltextindizes ist überhaupt nicht für den LIKE
Operator, sie hat ihre eigenen Operatoren und funktioniert nicht für beliebige Zeichenfolgen. Es arbeitet mit Wörtern, die auf Wörterbüchern und Stemming basieren. Es tut Unterstützung für Worte Abgleich von Präfixen , aber nicht mit dem LIKE
Betreiber:
Trigrammindizes für LIKE
Installieren Sie das zusätzliche Modul pg_trgm
, das Operatorklassen für GIN- und GiST-Trigrammindizes bereitstellt , um alle LIKE
und ILIKE
Muster zu unterstützen , nicht nur links verankerte:
Beispielindex:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
Oder:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Beispielabfrage:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigramme? Was ist mit kürzeren Saiten?
Wörter mit weniger als 3 Buchstaben in indizierten Werten funktionieren weiterhin. Das Handbuch:
Bei jedem Wort werden zwei Leerzeichen und ein Leerzeichen vorangestellt, wenn die in der Zeichenfolge enthaltene Menge von Trigrammen bestimmt wird.
Und Suchmuster mit weniger als 3 Buchstaben? Das Handbuch:
Für beide LIKE
und regulären Ausdrücken sucht, bedenken Sie, dass ein Muster ohne ausziehbare trigrams zu einem Full-Index - Scan degeneriert wird.
Das bedeutet, dass Index- / Bitmap-Index-Scans immer noch funktionieren (Abfragepläne für vorbereitete Anweisungen werden nicht unterbrochen). Sie erhalten einfach keine bessere Leistung. Normalerweise kein großer Verlust, da Zeichenfolgen mit 1 oder 2 Buchstaben kaum selektiv sind (mehr als ein paar Prozent der zugrunde liegenden Tabellenübereinstimmungen) und die Indexunterstützung die Leistung zunächst nicht verbessern würde, da ein vollständiger Tabellenscan schneller ist.
text_pattern_ops
für Präfixabgleich
Für nur links verankerte Muster (kein führender Platzhalter) erhalten Sie das Optimum mit einer geeigneten Operatorklasse für einen btree-Index: text_pattern_ops
oder varchar_pattern_ops
. Beide integrierten Funktionen von Standard-Postgres, kein zusätzliches Modul erforderlich. Ähnliche Leistung, aber viel kleinerer Index.
Beispielindex:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Beispielabfrage:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Oder sollten , wenn Sie Ihre Datenbank mit dem laufen ‚C‘ locale (effektiv keine locale), dann ist sowieso alles nach Byte - Reihenfolge sortiert und ein einfaches btree Index mit Standardoperatorklasse macht den Job.
Weitere Details, Erklärungen, Beispiele und Links in diesen verwandten Antworten auf dba.SE: