2009-07-30 5 views
4

Ich versuche, Volltextsuche in PostgreSQL 8.3 zu tun. Es funktionierte prächtig, also fügte ich Synonymabgleiche (z. B. "bob" == "robert") unter Verwendung eines Synonymwörterbuchs hinzu. Das funktioniert auch super. Aber ich habe bemerkt, dass es anscheinend nur ein Wort erlaubt, ein Synonym zu haben. Das heißt, 'al' kann nicht 'albert' und 'allen' sein.Mehrere Synonymwörterbuch Übereinstimmungen in PostgreSQL Volltextsuche

Ist das korrekt? Gibt es eine Möglichkeit, mehrere Wörterbuchübereinstimmungen in einem PostgreSQL-Synonymwörterbuch zu haben?

Als Referenz hier ist mein Beispielwörterbuch-Datei:

bob robert 
bobby robert 
al  alan 
al  albert 
al  allen 

Und die SQL, die die Volltextsuche Konfiguration erstellt:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname); 
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple); 
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple; 

Was mache ich falsch? Vielen Dank!

Antwort

4

Das ist eine Einschränkung in der Funktionsweise der Synonyme. Was Sie tun können, ist es umdrehen, wie in:

bob robert 
bobby robert 
alan al 
albert al 
allen al 

Es sollte das gleiche Endergebnis geben, das ist, dass die Suche nach einer von denen, die gleiche Sache entsprechen.

+0

Hmm. Das hilft, obwohl ich denke, dass es keine Möglichkeit gibt, eine Beziehung von vielen zu vielen zu haben. Zum Beispiel ist dies nicht möglich zu beheben: vin vincent vin vincenzo Vinnie Vincent vinnie vincenzo Dank aber! –

2

muss ein Wörterbuch eine funktionale Beziehung zwischen den Wörtern definieren und Lexeme sonst wird es nicht, welches Wort zurückzukehren wissen, wann Sie lexize. In Ihrem Beispiel wird al drei verschiedenen Werten zugeordnet, wodurch eine mehrwertige Funktion definiert wird und die Lexize-Funktion nicht weiß, was zurückgegeben werden soll. Wie Magnus zeigt, können Sie von den Eigennamen alan, albert, allen zum Spitznamen al lexisieren.

Beachten Sie jedoch, dass der Punkt eines FTS-Wörterbuchs nicht darin besteht, Transformationen per se durchzuführen, sondern eine effiziente Indexierung semantisch relevanter Wörter zu ermöglichen. Dies bedeutet, dass das Lexem nicht in irgendeinem linguistischen Sinn dem ursprünglichen Eintrag ähneln muss. Obwohl Sie Recht haben, dass eine Viele-zu-Viele-Beziehung unmöglich zu definieren ist, müssen Sie das wirklich tun? Zum Beispiel Ihr vin Beispiel zu beheben:

vin  vin 
vincent vin 
vincenzo vin 
vinnie  vin 

aber man könnte auch dies tun:

vin  grob 
vincent grob 
vincenzo grob 
vinnie  grob 

und den gleichen Effekt (obwohl, warum Sie wollen würde, um eine andere Geschichte).

Wenn Sie also ein Dokument analysieren sind sagen mit 11 Versionen des Namen Vincent dann der to_tsvector Funktion vin:11 im ersteren Fall und grob:11 im letzteren zurückkehren würden.

Verwandte Themen