2009-08-08 2 views
14

Was ist der beste Weg, um Synonyme (Phrasen) mit Lucene zu behandeln? Insbesondere, wenn ich Abfragen wie ausführen müssen: a OR b OR c NICHT dSynonyme mit Lucene

Wie wäre es mit dem Hinzufügen eines neuen Feldes namens "Synonyme" zu jedem Dokument beim Indexieren? Der Wert dieses Felds würde eine Liste aller Synonyme enthalten. Es würde nur zu einem Dokument hinzugefügt, wenn dieses Dokument eines der Synonyme hat.

dann würde ich ausführen eine „OR“ Abfrage suchen, die zusammen mit anderen Bereichen für den Suchbegriff in diesem Bereich aussehen würden.

Kann dieser Ansatz für jede Art von Abfrage gut funktionieren?

FYI, Die Synonyme in meiner Anwendung sind völlig individuelle und nicht von Englisch-Wörterbuch ... dh. "Global Leader in Finance" könnte auch bedeuten, "Top Investment Bank" oder "Fortune-500-Finance Firma" etc etc.

Bitte vorschlagen.

Danke.

Antwort

11

Es gibt einen Beitrag zum Lucene-Projekt namens "wordnet". Nach its documentation:

Dieses Paket von WordNet definiert Synonyme verwendet einen Lucene Index speichert sie, was wiederum zu bauen, können für die Suche nach Expansion verwendet werden. Normalerweise führen Sie Syns2Index einmal aus, um den Abfrageindex/"database" zu erstellen, und dann SynExpand.expand (...), um eine Abfrage zu erweitern.

Es enthält eine Probe von dem, was sie tut:

Abfrage:: big adult^0.9 bad^0.9 bighearted^0.9 boastful^0.9 boastfully^0.9 bounteous^0.9 bountiful^0.9 braggy^0.9 crowing^0.9 freehanded^0.9 giving^0.9 grown^0.9 grownup^0.9 handsome^0.9 large^0.9 liberal^0.9 magnanimous^0.9 momentous^0.9 openhanded^0.9 prominent^0.9 swelled^0.9 vainglorious^0.9 vauntingly^0.9 dog andiron^0.9 blackguard^0.9 bounder^0.9 cad^0.9 chase^0.9 click^0.9 detent^0.9 dogtooth^0.9 firedog^0.9 frank^0.9 frankfurter^0.9 frump^0.9 heel^0.9 hotdog^0.9 hound^0.9 pawl^0.9 tag^0.9 tail^0.9 track^0.9 trail^0.9 weenie^0.9 wiener^0.9 wienerwurst^0.9

Sie

Wenn Sie in der Abfrage "big dog" es passieren dann ausdruckt Beachten Sie, dass die ursprünglichen Wörter ("groß" und "Hund") keine Gewichtung haben. Die Synonyme haben jedoch eine Gewichtung (0.9), die Sie selbst konfigurieren können.

Es kommt mit der Standard-Distribution von Lucene im Verzeichnis "contrib".

+0

Danke für deine Eingaben Adam ... Könntest du bitte nochmal auf meine Frage verweisen? Ich habe sie jetzt bearbeitet. –

+1

Das WordNet-Modul erstellt einen Lucene-Index, genau wie Sie. Dieser Index, den er erstellt, wird schließlich zum Erweitern von Abfragen verwendet. Wenn Sie einfach versucht haben, diesen Index aus dem Wörterbuch von WordNet zu erstellen, können Sie sicher sagen, welche Feldnamen er für seinen Index verwendet, und Sie können selbst eigene Einträge hinzufügen. –

0

Ich bevorzuge es, eine Suche mit der gesamten eingegebenen Phrase auszuführen und etwas schwerer als die nächste Reihe von Suchanfragen gewichtet. Ich möchte dann jedes Wort im Satz durchgehen und damit suchen, wobei diese Ergebnisse eine niedrigere Punktzahl erhalten. Dann aggregiere ich die Bewertungen für alle zurückgegebenen Artikel mehr als einmal und sortiere die Ergebnisse entsprechend. Dies ist vielleicht nicht der 100% beste Weg, dies zu tun ... aber es hat in der Vergangenheit gut für mich gearbeitet.

1

Sie können das Abfrageobjekt abrufen, nachdem Sie die Eingabeabfragezeichenfolge mit QueryParser.parse() analysiert haben.

In den meisten Fällen ist die Abfrage auf oberster Ebene eine boolesche Abfrage mit Unterabfragen als untergeordnete Elemente. Sie können das Abfrageobjekt rekursiv durchlaufen. Wenn Sie ein TermQuery- oder PhraseQuery-Objekt treffen, können Sie die (Teil-) Abfrage abrufen und dieses Abfrageobjekt durch ein boolesches Abfrageobjekt ersetzen, das aus seinen Synonymen besteht.

Im Wesentlichen wandeln Sie Ihre ursprüngliche Abfrage

a OR b AND c 

zu

(a OR synA) OR (b OR synB1 OR synB2) AND c 

bei Abfrageobjekt Betrieb sicherzustellen, dass Sie einfach den Blattknoten der Abfrage mit neuen Anfragen ersetzen und nicht Geige mit beliebig komplexer Suchhierarchie.