Поиск по ключевым словам (ИЛИ, И) в Lucene - PullRequest
18 голосов
/ 21 августа 2009

Я использую 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"

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

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, вероятно, зарезервированы и будут действовать как ключевые слова.

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

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

Ответы [ 6 ]

4 голосов
/ 21 августа 2009

Полагаю, вы пытались заключить "ИЛИ" в двойные кавычки?

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

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

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

становится

| <OR: ("||") >

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

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

3 голосов
/ 20 апреля 2012

Выход из ИЛИ и И с двойными кавычками работает для меня. Поэтому попробуйте использовать строку Java, например

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

3 голосов
/ 22 августа 2009

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

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

1 голос
/ 21 августа 2009

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

пожалуйста, посмотрите на эти предложения

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

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

1) Хранимый 2) Токенизированный 3) Индексируемый 4) Вектор

может иметь существенное значение

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

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

0 голосов
/ 21 августа 2009

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

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

Подробнее о побеге

0 голосов
/ 21 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...