14 Stimmen

Wie kann man eine phrasenbasierte Volltextsuche in Postgres durchführen, die den Volltextindex nutzt?

Nehmen wir an, Sie haben eine Postgres 8.3 Tabelle wie folgt:

CREATE TABLE t1 (body text, body_vector tsvector);

Ich möchte mit Hilfe des Volltextindexes (GiST, GiN oder beides in der Spalte tsvector) nach Phrasen suchen können. Die beste Lösung, die ich gefunden habe, besteht darin, zunächst die Volltextsuche für beide Wörter durchzuführen (boolesches UND) und dann einen ähnlichen Vergleich für den Ausdruck im Textkörper durchzuführen. Dabei wird natürlich kein Stemming oder keine Rechtschreibprüfung durchgeführt, die die Volltextsuche von Postgres für Sie erledigt. Ein Beispiel: Wenn ich nach der Phrase "w1 w2" suche, würde ich verwenden:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

Gibt es eine Möglichkeit, dies zu tun, ohne in der Textspalte suchen zu müssen?

13voto

Magnus Hagander Punkte 22152

Wenn Sie einen exakten Ausdrucksabgleich wünschen, ist das der richtige Weg. Sie können es auch mit WHERE body_vector @@ plainto_tsquery('w1 w2') versuchen und dann nach Rangfolge sortieren. (Der Punkt ist, dass die Treffer, bei denen die Wörter direkt nebeneinander stehen, ganz oben landen sollten)

9voto

Neil McGuigan Punkte 43578

Update: PostgreSQL 9.6 Textsuche unterstützt Phrasen

select
  *
from (values
  ('i heart new york'),
  ('i hate york new')
) docs(body)
where
  to_tsvector(body) @@ phraseto_tsquery('new york')

(1 row retrieved)

oder durch den Abstand zwischen den Wörtern:

-- a distance of exactly 2 "hops" between "quick" and "fox"
select
  *
from (values
  ('the quick brown fox'),
  ('quick brown cute fox')
) docs(body)
where
  to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved)

1 Stimmen

Vielleicht habe ich etwas übersehen, aber muss die Eingabezeichenfolge nicht den gesuchten Ausdruck zwischen einfachen Anführungszeichen enthalten? Wie könnte man es generell verwenden, wenn der Begriff aus einer Benutzereingabe stammt und das Dokument aus einer Datenbankspalte?

1 Stimmen

Dies ist immer noch keine "Phrasensuche". Das funktioniert nur, weil Ihr tsvector-Ausdruck "new york" in einfache Anführungszeichen eingeschlossen ist.

0 Stimmen

Ja beide Funktion tut - aber Ihre tsvector Zeichenfolge in den meisten Fällen nicht haben Single-Quotes auf sie - wenn es dann, was ist die Suchphrase für. Ich habe einen postgreSQL 9.4 und die Abfrage, die Sie haben, funktioniert - das ist nicht nur spezifisch für 9.6. select 'i heart new york city'::tsvector @@ 'new'::tsquery, --true 'i heart new york city'::tsvector @@ 'new & york'::tsquery, --true 'i heart new york city'::tsvector @@ '''new york'''::tsquery --false

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X