При индексировании Луцен разделяет текст на атомные единицы (токены). На этом этапе может произойти много вещей (например, нижняя шкала, стеблирование, удаление стоп-слов и т. Д.). Конечным результатом является термин.
Затем, когда вы запрашиваете, Lucene применяет точно такой же алгоритм к запросу, чтобы он мог соответствовать термину с термином.
В: Почему нет TermQuery
требуется анализатор?
A: QueryParser
объект анализирует строку запроса и производит TermQuery
(также может генерировать другие типы запросов, например PhraseQuery
). TermQuery
уже содержит термины в той же форме, что и в индексе. Если вы (как программист) абсолютно уверены в том, что вы делаете, вы можете сами создать TermQuery
, но это предполагает, что вы знаете точную последовательность разбора запросов, и знаете, как выглядят термины в индексе.
В: Почему нет BooleanQuery
требуется анализатор?
A: BooleanQuery
просто присоединяется к другим запросам с использованием операторов (AND/OR/MUST/SHOULD и т. Д.). Это не очень полезно без каких-либо других запросов.
Это очень упрощенный ответ. Я очень рекомендую читать книгу Introduction to Information Retrieval; он содержит теорию, на основе которой написан Луцен (и другие подобные рамки). Эта книга доступна онлайн бесплатно.
Спасибо, но это не объясняет, почему указание анализатора требуется только при анализе строки для запроса, а не всегда при запросе. – haim770
Отредактировал свой ответ, дайте мне знать, если он недостаточно ясен или пропускает что-либо. – mindas