Запрос Lucene БЕЗ операторов

Я пытаюсь использовать Lucene для поиска имен в базе данных. Однако некоторые имена содержат такие слова, как «НЕ» и «ИЛИ» и даже «-» без символов. Я по-прежнему хочу, чтобы различные токены внутри имен были разбиты с помощью анализатора и выполнялись поиски в виде логической комбинации терминов, но я не хочу, чтобы Lucene интерпретировала какие-либо термины «НЕ»/«ИЛИ» как операторы (вместо этого я хотите, чтобы их искали как обычные термины).

Один из способов выполнить то, о чем я говорю, — это вручную запустить Анализатор для поискового запроса, а затем вручную создать логический запрос на основе всех полученных токенов. Это лучший способ? У меня сложилось впечатление, что анализаторы были разработаны для использования в сочетании с парсером запросов, и я чувствую, что должен быть встроенный способ выполнить то, что я пытаюсь сделать. Кто-нибудь знает, как лучше всего это сделать?


person ghempton    schedule 22.12.2009    source источник


Ответы (1)


Предлагаемый вами подход к построению BooleanQuery из TokenStream имеет смысл. API QueryParser на самом деле предназначен только для анализа структурированных запросов с использованием определенного синтаксиса — если вы не используете синтаксис анализатора запросов, я не вижу причин использовать QueryParser вместо созданного вручную логического запроса.

Однако, если вы используете StandardAnalyzer (или другой анализатор с StopFilter) для индексации полей, такие слова, как «И», «НЕ» и «ИЛИ», не будут индексироваться, и поиск по ним невозможен. Таким образом, в этом случае вы могли бы так же легко удалить эти слова и операторы, такие как «-» и «+», из ваших запросов, используя регулярное выражение. Однако я бы скорее рекомендовал подход BooleanQuery.

person Alex Vigdor    schedule 22.12.2009