2009-08-08 14 views
14

Jaki jest najlepszy sposób obsługi synonimów (fraz) za pomocą Lucene? W szczególności, gdy potrzebuję wykonać zapytania takie jak: OR OR LUB NIE, dSynonimy za pomocą Lucene

Co powiesz na dodanie nowego pola o nazwie "synonimy" do każdego dokumentu podczas indeksowania? Wartość tego pola będzie zawierać listę wszystkich synonimów. Zostałaby dodana do dokumentu tylko wtedy, gdy dokument ten zawiera którykolwiek z synonimów.

Chciałbym wtedy wykonać zapytanie "LUB", które wyszuka słowo kluczowe w tym polu wraz z innymi polami.

Czy to podejście sprawdza się w przypadku każdego zapytania?

FYI, Synonimy w mojej aplikacji są całkowicie niestandardowe, a nie ze słownika angielskiego ... "Global Leader in Finance" może również oznaczać "Top Investment Bank" lub "Fortune 500 Finance Company" itp.

Proszę zasugerować.

Dzięki.

Odpowiedz

11

Istnieje wkład w projekt Lucene pod nazwą "wordnet". Według its documentation:

Pakiet ten wykorzystuje synonimy zdefiniowane WordNet zbudować Lucene ich przechowywanie, które z kolei mogą być używane do ekspansji zapytania. Zazwyczaj uruchamiasz Syns2Index raz, aby zbudować indeks zapytania/"bazę danych", a następnie wywołasz SynExpand.expand (...), aby rozwinąć zapytanie.

Obejmuje próbkę tego, co robi:

Jeśli przechodzą w zapytaniu "duży pies", a następnie wypisze:

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

ty zobacz, że oryginalne słowa ("duży" i "pies") nie mają żadnego powiązania z nimi. Jednak synonimy mają wagę (0,9), którą możesz sam skonfigurować.

Jest dostarczany w pakiecie ze standardową dystrybucją Lucene w katalogu "contrib".

+0

Dzięki za ur wejść Adam ... Czy mógłbyś jeszcze raz odnieść się do mojego pytania? –

+1

Moduł WordNet buduje indeks Lucene, tak jak Ty. Ten indeks, który buduje, jest ostatecznie wykorzystywany do rozszerzania zapytań. Jeśli po prostu próbowałeś budować ten indeks ze słownika WordNet, jestem pewien, że możesz łatwo powiedzieć, jakie nazwy pól używają dla swojego indeksu i samodzielnie dodać własne, niestandardowe wpisy. –

0

Wolę wyszukiwać, używając całej wprowadzonej frazy i ważąc wszystko, co wróciło cięższe niż następna seria wyszukiwań. Następnie lubię powtarzać każde słowo w wyrażeniu i wyszukiwać, przy czym te wyniki uzyskują niższy wynik. Następnie agreguję wyniki dla wszystkich pozycji zwróconych więcej niż raz i odpowiednio sortuję wyniki. To może nie być 100% najlepszy sposób robienia tego ... ale w przeszłości zadziałało dobrze.

1

Możesz otrzymać obiekt zapytania po przeanalizowaniu wejściowego ciągu zapytania za pomocą QueryParser.parse().

W większości przypadków zapytanie najwyższego poziomu to zapytanie logiczne z pod-zapytaniami jako elementami podrzędnymi. Możesz rekursywnie iterować na obiekcie zapytania. Po kliknięciu obiektu TermQuery lub PhraseQuery można uzyskać zapytanie (pod) i zastąpić ten obiekt zapytania boolowskim obiektem zapytania składającym się z jego synoymów, jeśli takie istnieją.

Zasadniczo, jesteś przekształcania pierwotnym zapytaniu

a OR b AND c 

do

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

pracujące w obiekcie zapytania upewnić się, że po prostu wymienić węzły liść zapytania z nowych zapytań i nie bawić z dowolnie złożoną hierarchią zapytań.