2016-08-08 49 views
0

Ich möchte nach mehreren Spalten in mehreren Tabellen suchen. Wie folgt aus: Bei Tabellen:postgresql mehrere Spaltensuche mit Ranking

Benutzer id first_name last_name E-Mail

Firmen User_id Adresse

Lands Name

company_id

Lassen Sie uns sagen Mitglied ist Johnny Bravo (johny .bravo @ gmail.com) arbeiten in Washington in den Vereinigten Staaten. Ich möchte den Datensatz finden, basierend auf Abfrage „at“ -> aus USA oder „Rav“ von Bravo

Als ich „Rav“ mein Johnny Bravo Rang höher als Johny Bravos mit anderen E-Mails geben Sie so es ist zuerst in den Ergebnissen

Wie kann ich solche Funktionalität implementieren? Ich habe auf ts_vector und ts_rank geschaut, aber es scheint, dass es nur rechte Wildcard ("to_tsquery ('Brav: *')") funktioniert, auch brauche ich keine Volltextsuchfunktionen (ich werde suchen Adressen und Benutzernamen so keine Notwendigkeit, Alias-Namen usw.) Ich kann Wildcard-Suche tun, aber dann müsste ich Ranking in Anwendung manuell berechnen

Antwort

1

Sie könnten pg_trgm extension verwenden.

Sie müssen die Contrib installiert haben, installieren Sie die Erweiterung:

create extension pg_trgm; 

Dann können Sie trigram Indizes erstellen:

create index user_idx on user using gist (user_data gist_trgm_ops); 

Und Sie können dann Abfrage, die Sie zuerst 10 geben die meisten ähnliche Werte:

select * from user order by user_data <-> 'rav' limit 10; 

Beachten Sie, dass Sieersetzen könnenmit einer unveränderlichen Funktion, die alle Informationen in ein (Text-) Feld verketten kann, wodurch die Suche über mehrere Felder ermöglicht wird.

Um "Ranking-Score" zu erhalten, können Sie similarity function verwenden, die 1 für identische Zeichenfolgen und 0 für völlig unabhängig zurückgibt.

Wenn Sie eine Volltextsuche über die gesamte Datenbank benötigen, könnte eine bessere Lösung eine separate Suchfunktion wie Apache Solr sein.

+1

+1 zu dieser Antwort, das einzige Ting, das ich erwähnen würde, ist, 'Ähnlichkeit()' Funktion zu verwenden, um Benutzer die relevantesten Ergebnisse zu geben. –

+0

Einverstanden und aktualisiert. – hruske

+0

Danke für die Antwort! Ähnlichkeitsfunktion ist nicht genau das, was ich will. Ich möchte nicht nach Rechtschreibfehlern suchen, sondern bei mehreren Wortereignissen höher rangieren. Wenn alles in Vorname, E-Mail und Firmennamen ist, ist der Rang höher. Irgendwelche Ideen, was kann ich dafür benutzen? –