2013-03-05 9 views
6

Jestem nowym użytkownikiem Lucene i próbuję parsować nieprzetworzony ciąg znaków w postaci Query przy użyciu QueryParser.Dlaczego Lucene QueryParser potrzebuje analizatora

Zastanawiam się, dlaczego metoda QueryParser.Parse() wymaga w ogóle parametru Analyzer?

Jeżeli analiza jest coś, co ma zrobić z zapytań, wówczas Analyzer powinna być określona w kontaktach z regularnych Query obiektów, jak również (TermQuery, BooleanQuery etc), a jeśli nie, to dlaczego jest QueryParser tego wymaga?

Odpowiedz

10

Podczas indeksowania Lucene dzieli tekst na jednostki atomowe (tokeny). Podczas tej fazy może się zdarzyć wiele rzeczy (na przykład obniżenie poziomu, powstrzymanie, usunięcie słów kluczowych itp.). Wynik końcowy to termin.

Następnie, po zapytaniu, Lucene stosuje dokładnie ten sam algorytm do zapytania, aby mógł dopasować termin do terminu.

P: Dlaczego TermQuery nie wymaga analizatora?
A: QueryParser obiekt analizuje ciąg zapytania i generuje TermQuery (może również generować inne typy zapytań, np. PhraseQuery). TermQuery zawiera już warunki w tym samym kształcie, co w indeksie. Jeśli (jako programista) jesteś absolutnie pewien, co robisz, możesz samemu stworzyć numer TermQuery - ale to zakłada, że ​​znasz dokładną sekwencję analizowania zapytań i wiesz, jak terminy wyglądają w indeksie.

P: Dlaczego BooleanQuery nie wymaga analizatora?
A: BooleanQuery po prostu dołącza do innych zapytań za pomocą operatorów (AND/OR/MUST/SHOULD, itp.). Sam nie jest użyteczny bez żadnych innych pytań.

To jest uproszczona odpowiedź na pytanie: bardzo. Bardzo polecam lekturę książki Introduction to Information Retrieval; zawiera teorię, na podstawie której napisano Lucene (i inne podobne ramy). Ta książka jest dostępna online za darmo.

+0

Dzięki, ale nie wyjaśnia, dlaczego określenie analizatora jest wymagane tylko podczas analizowania łańcucha w celu wysłania kwerendy, a nie zawsze przy kwerendach. – haim770

+0

Zmieniono moją odpowiedź, daj mi znać, jeśli nie jest to wystarczająco jasne lub brakuje czegoś. – mindas