2016-04-29 27 views
-1

Hier ist das Problem:PostgreSQL Volltextsuche: Cant erhält eine teilweise Übereinstimmung von tsvector

ich eine Tabelle in PostgreSQL mit Adressen im Klartext und tsvectors habe. Und ich versuche, eine Adresse in einer Abfrage wie diesem zu finden.

SELECT * FROM address_catalog 
WHERE address_catalog.search_vector @@ to_tsquery('123456:* & Klingon:* & Empire:* & Kronos:* & city:* & Matrok:* & street:* & 789:*') 

Aber das Problem ist, dass ich nichts über die Adresse in einer Abfrage weiß. Ich kann nicht definieren, wo sich ein Land, eine Stadt oder eine Straße in der eingehenden Zeichenfolge befindet. Ich weiß nicht, welche Reihenfolge der Wörter die Adresse hat, oder enthält sie zusätzliche Wörter.

Ich kann nur nach Ländern und Städten suchen, aber wenn die eingehende Zeichenfolge Straße, Index oder irgendetwas anderes enthält, gibt die Suche nichts wegen der Konjunktion aller Vektor-Token zurück. Gleichzeitig kann ich einfach keine Stringteile löschen oder Disjunktionen verwenden, weil ich nie weiß, wo in der Zeichenfolge die zusätzlichen Wörter sind.

Also, gibt es eine Möglichkeit, eine Tsquery zu konstruieren, um einige der besten Übereinstimmungen für die eingehende Zeichenfolge zurückzugeben? Oder vielleicht Teiltreffer? Als ich versuchte, es zu zwingen, ODER anstelle von AND überall in tsquery zu benutzen, gab es mir fast die ganze Datenbank zurück. Ich brauche Vektoren Kreuzung ... in Postgresql.

Antwort

1

Ich würde die Erweiterung smlar (PDF) dafür empfehlen. Es wurde von denselben Leuten geschrieben, die Textsuche geschrieben haben. Damit können Sie die TF-IDF Ähnlichkeitsmaß verwenden, die hier

für „fremde“ Abfragebegriffe

erlaubt, wie es zu kompilieren (ich habe nicht herausgefunden, wie es unter Windows zu kompilieren):

http://blog.databasepatterns.com/2014/07/postgresql-install-smlar-extension.html

Und hier ist, wie es zu verwenden ist:

http://blog.databasepatterns.com/2014/08/tf-idf-text-search-in-postgres.html