it-swarm.com.de

Erhalten Sie eine teilweise Übereinstimmung aus der Spalte GIN-Index TSVECTOR

Ich möchte Ergebnisse erhalten, indem ich Folgendes abfrage:

SELECT * FROM (
  SELECT id, subject
  FROM mailboxes
  WHERE tsv @@ plainto_tsquery('avail')
) AS t1 ORDER by id DESC;

Dies funktioniert und gibt Zeilen mit tsv zurück, die Available enthalten. Aber wenn ich avai (gelöscht lable) verwende, kann es nichts finden.

Müssen sich alle Abfragen im Wörterbuch befinden? Können wir solche Briefe nicht einfach abfragen? Ich habe eine Datenbank, die E-Mail-Text (Inhalt) enthält, und ich möchte es schnell machen, wenn es jede Sekunde wächst. Zur Zeit benutze ich

... WHERE content ~* 'letters`
13
xangr

Müssen sich alle Abfragen im Wörterbuch befinden?

Nein. Da sich zunächst nur Word-Stämme (entsprechend der verwendeten Textsuchkonfiguration ) im Index befinden. Aber noch wichtiger:

Nein . Denn obendrein ist Volltextsuche auch fähig zu Präfixabgleich :

Das würde funktionieren:

SELECT id, subject
FROM   mailboxes
WHERE  tsv @@ to_tsquery('simple', 'avail:*')
ORDER  BY id DESC;

Beachten Sie 3 Dinge:

  1. Verwenden Sie to_tsquery(), nicht plainto_tsquery(), in diesem Fall weil ( zitiert das Handbuch ):

    ... plainto_tsquery Erkennt tsquery Operatoren, Gewichtsbeschriftungen oder Präfix-Übereinstimmungsbeschriftungen in seiner Eingabe nicht

  2. Verwenden Sie die Textsuchkonfiguration 'simple', Um das tsquery zu generieren, da Sie offensichtlich das Wort 'verfügbar' so wie es ist verwenden und kein Stemming anwenden möchten.

  3. Fügen Sie :* hinzu, um eine Präfixsuche zu erstellen, d. H. Finden Sie alle Lexeme, die mit 'verfügbar' beginnen.

Wichtig: Dies ist eine Präfixsuche nach Lexemen (Word-Stämmen) im Dokument. Eine Übereinstimmung mit regulären Ausdrücken ohne Platzhalter (content ~* 'avail') Ist nicht genau dasselbe! Letzteres ist nicht links 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 möchten. Trigrammindizes ( pg_trgm ) wie @ Evan bereits vorgeschlagen sind das richtige Werkzeug dafür. 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 Anderer Ansatz zur Optimierung der Suche):

E-Mails?

Da Sie E-Mails erwähnt haben, beachten Sie, dass der Textsuchparser E-Mails identifiziert und nicht in separate Wörter/Lexeme aufteilt. Erwägen:

SELECT ts_debug('english', '[email protected]')
(email,"Email address",[email protected],{simple},simple,{[email protected]})

Ich würde die Trennzeichen @ Und . In Ihren E-Mails durch Leerzeichen (' ') Ersetzen, um enthaltene Wörter zu indizieren.

Da Sie sich in E-Mails mit Namen beschäftigen, nicht mit Englisch (oder einer anderen Sprache) Wörter, würde ich den 'simple' Verwenden. Textsuchkonfiguration zum Deaktivieren von Stemming und anderen Sprache Funktionen:

Erstellen Sie die Spalte ts_vector Mit:

SELECT to_tsvector('simple', translate('[email protected]', '@.', '  ')) AS tsv;
23