Müssen alle Abfragen im Wörterbuch sein?
Nein, da sich im Index zunächst nur Wortstämme (entsprechend der verwendeten Textsuchkonfiguration ) befinden. Aber noch wichtiger:
Nein . Darüber hinaus kann die Volltextsuche auch mit folgenden Präfixen verglichen werden :
Das würde funktionieren:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Beachten Sie 3 Dinge:
Verwenden Sie in diesem Fall to_tsquery()
nicht plainto_tsquery()
, weil (unter Bezugnahme auf das Handbuch ):
... plainto_tsquery
erkennt tsquery
in der Eingabe keine Operatoren, Gewichtungsbezeichnungen oder Präfix-Übereinstimmungsbezeichnungen
Verwenden Sie die 'simple'
Konfiguration für die Textsuche, um das zu generieren, tsquery
da Sie offensichtlich das Wort 'avail' so wie es ist und kein Stemming anwenden möchten .
Hänge :*
an, um eine Präfixsuche zu machen, dh finde alle Lexeme, die mit 'avail' beginnen.
Wichtig: Dies ist eine Präfixsuche nach Lexemen (Wortstämmen) im Dokument. Eine Übereinstimmung mit regulären Ausdrücken ohne Platzhalter ( content ~* 'avail'
) ist nicht genau dasselbe! Letzterer ist nicht verankert (bis zum Beginn der Lexeme) und würde auch "FOOavail" usw. finden.
Es ist unklar, ob Sie das in Ihrer Abfrage beschriebene Verhalten oder das Äquivalent des hinzugefügten regulären Ausdrucks wünschen. Trigramm-Indizes ( pg_trgm
) wie @Evan sind dafür das richtige Werkzeug. Es gibt viele verwandte Fragen zu dba.SE, versuchen Sie eine Suche .
Überblick:
Demo
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Letzte verwandte Antwort (Kapitel Unterschiedlicher Ansatz zur Optimierung der Suche ):
E-Mails?
Da Sie E-Mails erwähnt haben, beachten Sie, dass der Parser für die Textsuche E-Mails identifiziert und diese nicht in separate Wörter / Lexeme aufteilt. Erwägen:
SELECT ts_debug('english', '[email protected]')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Ich würde die Trennzeichen @
und .
in Ihren E-Mails durch Leerzeichen ( ' '
) ersetzen, um die enthaltenen Wörter zu indizieren.
Auch, weil Sie es zu tun Namen in E - Mails, nicht mit Englisch (oder eine andere Sprache) Wörter , würde ich die Verwendung 'simple'
Textsuche Konfiguration zu deaktivieren entwickelt wurden und andere Sprache Funktionen:
Erstellen Sie die ts_vector
Spalte mit:
SELECT to_tsvector('simple', translate('[email protected]', '@.', ' ')) AS tsv;
:*
dokumentiertto_tsvector('simple'..)
? 2) Sollte eine Erwähnung zum Erstellen nicht mit Anweisungen einhergehen, die bei zukünftigen Abfragen dieses TSV auch die 'einfache' Konfiguration erfordern, um dies abzufragen? Ich denke, Sie sollten die Konsequenzen der Deaktivierung des Stemmings auf einem tsvector / tsquery klären.0.380ms
, um ein Ergebnis zu erzielen . Nach deinem Weg hat es gedauert0.079 ms
.pg_trgm
. FTS ist schneller (mit kleinerem Index). Sie können sogar beide Indizes kombinieren ...