2009-08-08 20 views
14

Qual è il modo migliore per gestire i sinonimi (frasi) utilizzando Lucene? In particolare, quando ho bisogno di eseguire query come: a OR b O c dSinonimi utilizzando Lucene

Come aggiungere un nuovo campo chiamato "sinonimi" a ciascun documento durante l'indicizzazione? Il valore di questo campo dovrebbe avere un elenco di tutti i sinonimi. Sarebbe aggiunto a un documento solo quando quel documento ha uno dei sinonimi.

Eseguirò quindi una query di ricerca "OR" che cercherebbe la parola chiave di ricerca in questo campo insieme ad altri campi.

Questo approccio può funzionare bene per qualsiasi tipo di query?

FYI, I sinonimi nella mia applicazione sono totalmente personalizzati e non dal dizionario inglese ... cioè. "Global Leader in Finance" potrebbe anche significare "Top Investment Bank" o "Fortune 500 Finance company" ecc. Ecc.

Si prega di suggerire.

Grazie.

risposta

11

C'è un contributo al progetto Lucene chiamato "wordnet". Secondo its documentation:

Questo pacchetto utilizza i sinonimi definiti da WordNet per creare un indice Lucene che li memorizza, che a sua volta può essere utilizzato per l'espansione della query. Di norma, si esegue Syns2Index una volta per creare l'indice della query/"database", quindi chiamare SynExpand.expand (...) per espandere una query.

Esso include un esempio di ciò che fa:

Se si passa nella query "big dog", allora esso stampa:

Query: 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

È vedere che le parole originali ("grande" e "cane") non hanno alcun peso attribuito ad esse. I sinonimi, tuttavia, hanno una ponderazione (0.9) che è possibile configurare da soli.

Viene fornito in bundle con la distribuzione standard di Lucene, nella directory "contrib".

+0

Grazie per i tuoi ingressi Adam ... Potresti per favore fare riferimento alla mia domanda di nuovo? Ora l'ho modificato. –

+1

Il modulo WordNet crea un indice Lucene, proprio come te. Questo indice che costruisce viene infine utilizzato per espandere le query. Se hai semplicemente provato a creare questo indice dal dizionario di WordNet, sono sicuro che potresti facilmente sapere quali nomi di campo sta usando per il suo indice e aggiungere tu stesso le tue voci personalizzate. –

0

Preferisco eseguire una ricerca utilizzando l'intera frase immessa e pesare tutto restituito più pesante rispetto alla successiva serie di ricerche. Mi piace quindi scorrere tutte le parole della frase e cercare con quelle che ottengono un punteggio più basso. Quindi aggrego i punteggi per tutti gli articoli restituiti più di una volta e ordina i risultati di conseguenza. Questo potrebbe non essere il modo migliore al 100% per farlo ... ma ha funzionato benissimo per me in passato.

1

È possibile ottenere l'oggetto Query dopo aver analizzato la stringa di query di input con QueryParser.parse().

Nella maggior parte dei casi, la query di livello superiore è una query booleana con sottoquery come figli. È possibile ricorsivamente iterare sull'oggetto query. Quando si colpisce un oggetto TermQuery o PhraseQuery, è possibile ottenere la query (secondaria) e sostituire tale oggetto query con un oggetto di query booleano costituito da eventuali suoi synoyms.

In sostanza, state trasformando la query originale

a OR b AND c 

a

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

Operando ad oggetto query in modo che si sostituisce semplicemente i nodi foglia della query con nuove domande e non giocherellare con gerarchia di query arbitrariamente complessa.