Подтвердить что ты не робот

Поиск ключевого слова (OR, AND) в Lucene

Я использую Lucene на своем портале (на основе J2EE) для служб индексирования и поиска.

Проблема связана с ключевыми словами Lucene. Когда вы используете один из них в поисковом запросе, вы получите сообщение об ошибке.

Например:

searchTerms = "ik OR jij"

Это отлично работает, потому что он будет искать "ik" или "jij"

searchTerms = "ik AND jij"

Это отлично работает, он ищет "ik" и "jij"

Но при поиске:

searchTerms = "OR"
searchTerms = "AND"
searchTerms = "ik OR"
searchTerms = "OR ik"

Etc., он с ошибкой завершится ошибкой:

Component Name: STSE_RESULTS  Class: org.apache.lucene.queryParser.ParseException  Message: Cannot parse 'OR jij': Encountered "OR" at line 1, column 0. 
Was expecting one of: 
... 

Это имеет смысл, потому что эти слова являются ключевыми словами для Lucene, вероятно, зарезервированы и будут выступать в качестве ключевых слов.

На голландском языке слово "OR" важно, поскольку оно имеет значение для "Ondernemings Raad". Он используется во многих текстах, и его нужно найти. Например, "или" работает, но не возвращает тексты, соответствующие термину "ИЛИ". Как я могу сделать его доступным для поиска?

Как я могу избежать ключевого слова "или" ? Или Как я могу рассказать Люцену о том, чтобы лечить "или" как поисковый термин НЕ как ключевое слово.

4b9b3361

Ответ 1

Я полагаю, вы попытались поместить "OR" в двойные кавычки?

Если это не сработает, я думаю, вам, возможно, придется зайти так далеко, чтобы изменить источник Lucene, а затем перекомпилировать все это, так как оператор "OR" похоронен глубоко внутри кода. На самом деле компиляции, вероятно, недостаточно даже: вам придется изменить файл QueryParser.jj в исходном пакете, который служит в качестве ввода для JavaCC, а затем запустить JavaCC, а затем перекомпилировать все это.

Хорошая новость заключается в том, что есть только одна строка:

| <OR: ("OR" | "||") >

становится

| <OR: ("||") >

Таким образом, у вас будет только "||" как логический оператор ИЛИ. Существует build.xml, который также содержит вызов JavaCC, но вам нужно загрузить этот инструмент самостоятельно. Я не могу попробовать это сейчас, боюсь.

Это, вероятно, хороший вопрос для списка рассылки Lucene, но, пожалуйста, сообщите нам, если вы это сделаете, и они придумают более простое решение; -)

Ответ 2

Для меня работает escape-код OR и AND с двойными кавычками. Поэтому попробуйте с помощью строки Java, например

String query = "field:\"AND\"";

Ответ 3

ИЛИ, НЕ и И зарезервированы ключевые слова. Я решил эту проблему всего 2 дня назад, понизьте эти 3 слова в пользовательском поисковом выражении, прежде чем подавать ее в парсер lucene. Обратите внимание: если вы выполняете поиск и замену для этих ключевых слов, убедитесь, что вы используете границы слов (\ b), поэтому не изменяйте слова, такие как ANDROID и ORDER.

Затем я даю пользователю указать НЕ и И, используя - и +, как это делает Google.

Ответ 4

Я много раз читал ваш вопрос!= [

ознакомьтесь с этими предложениями

Как хранится ваш индекс?

Документ, содержащий сохраненные поля, может быть сохранен как

1) Сохранено 2) Tokenized 3) Индексировано 4) Вектор

он может сделать существенную разницу

используйте Luke, он может рассказать вам, как ваши индексы хранятся (фактически)

Люк должен быть, если вы работаете с lucene, так как он дает вам реальную информацию о том, как индексы хранятся, он также предлагает поиск, попробуйте, сообщите нам об этом с вашим обновлением!

Ответ 5

Вероятно, вы делаете что-то не так, когда строите запрос. Я сделаю второе предложение Нараяна о получении Люка (как опубликовано в комментариях) и попробую запустить ваши запросы с этим. Прошло немного времени с тех пор, как я использовал Lucene, но я не помню, чтобы когда-либо возникали проблемы с OR и AND.

Кроме этого, вы можете попробовать экранировать входные строки с помощью QueryParser.escape(userQuery)

Подробнее об экранировании

Ответ 6

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