2013-03-05 3 views
6

Я новичок в Lucene и пытаюсь разобрать необработанную строку в Query, используя QueryParser.Почему Lucene QueryParser нуждается в анализаторе

Мне было интересно, почему для метода QueryParser.Parse() необходим параметр Analyzer?

Если анализ является то, что должно делать с запросами, тогда Analyzer должно быть указан при работе с регулярными Query объектами, а также (TermQuery, BooleanQuery и т.д.), а если нет, то почему QueryParser требует?

ответ

10

При индексировании Луцен разделяет текст на атомные единицы (токены). На этом этапе может произойти много вещей (например, нижняя шкала, стеблирование, удаление стоп-слов и т. Д.). Конечным результатом является термин.

Затем, когда вы запрашиваете, Lucene применяет точно такой же алгоритм к запросу, чтобы он мог соответствовать термину с термином.

В: Почему нет TermQuery требуется анализатор?
A: QueryParser объект анализирует строку запроса и производит TermQuery (также может генерировать другие типы запросов, например PhraseQuery). TermQuery уже содержит термины в той же форме, что и в индексе. Если вы (как программист) абсолютно уверены в том, что вы делаете, вы можете сами создать TermQuery, но это предполагает, что вы знаете точную последовательность разбора запросов, и знаете, как выглядят термины в индексе.

В: Почему нет BooleanQuery требуется анализатор?
A: BooleanQuery просто присоединяется к другим запросам с использованием операторов (AND/OR/MUST/SHOULD и т. Д.). Это не очень полезно без каких-либо других запросов.

Это очень упрощенный ответ. Я очень рекомендую читать книгу Introduction to Information Retrieval; он содержит теорию, на основе которой написан Луцен (и другие подобные рамки). Эта книга доступна онлайн бесплатно.

+0

Спасибо, но это не объясняет, почему указание анализатора требуется только при анализе строки для запроса, а не всегда при запросе. – haim770

+0

Отредактировал свой ответ, дайте мне знать, если он недостаточно ясен или пропускает что-либо. – mindas