Почему Lucene (поиск в режиме гибернации) игнорирует мой собственный оператор?

#lucene #hibernate-search

#lucene #спящий режим-поиск

Вопрос:

Недавно я обновил свой поиск в режиме гибернации до версии 5.0.0.Alpha4, которая использует Lucene 4.8.1.

Я по-прежнему использую те же коды для создания своего поискового запроса, что и раньше (я использовал Lucene 3.3 до обновления, это была действительно старая версия :)). Но я заметил проблему, заключающуюся в том, что новая версия просто игнорирует мой оператор и все время использует оператор по умолчанию, однако в более старой версии коды работали нормально:

Например: теперь я устанавливаю «И» в качестве оператора по умолчанию. Я просто ввел «java или php» в поле поиска. И я поставил точку останова в строке QueryParser.parse(строка поиска). Это говорит мне, что моя строка поиска теперь «java или php», что правильно. Но созданный SearchQuery после QueryParser.parse():

  (title:java)  (title:php)
 

Это означает, что Lucene обрабатывает мою строку поиска как ЛОГИКУ «И»!

Я не знаю, является ли это ошибкой нового Lucene или я просто сделал что-то не так.

Вот коды:

 StandardAnalyzer analyzer = new StandardAnalyzer(
            Version.LUCENE_47);
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
    Version.LUCENE_47,
    mySearchFields,
    analyzer);
queryParser.setAllowLeadingWildcard(true);
queryParser.setDefaultOperator(myDefaultOperator);
queryParser.setAutoGeneratePhraseQueries(true);
Query searchQuery = queryParser.parse(searchString);

FullTextQuery jpaQuery = getFullTextEntityManager()
    .createFullTextQuery(searchQuery, entities);
jpaQuery.setMaxResults(ORACLE_MAXIMUM_ELEMENTS_IN_EXPRESSION);
 

Комментарии:

1. Я предполагаю, что вы на самом деле не ищете «A И B». Это вся история? Что такое booleanQuery for? Кроме того, попробуйте посмотреть, как searchQuery.toString() выглядит перед запуском запроса, по какой-то причине это может быть не то, что вы ожидали.

2. @femtoRgon В точке останова QueryParser.parse(строка поиска) Я проверил, что строка поиска по-прежнему «A И B». Но это действительно хорошая идея — удалить часть BooleanQuery, чтобы протестировать ее снова. Я попробую это прямо сейчас. Спасибо!

3. searchString на самом деле это не то, о чем я спрашивал. Query.toString не будет просто отбрасывать строку, переданную в QueryParser . Я хочу знать, как на самом деле выглядит сгенерированный запрос после синтаксического анализа и анализа. Кроме того, если это ваш фактический код, удаление BooleanQuery не решит вашу проблему, потому что он никогда не использовался. Отличается ли это в коде, который вы на самом деле запускаете?

4. @femtoRgon Я только что отредактировал вопрос, и теперь вы увидите, как выглядит созданный запрос. Да, я только что заметил, что забыл использовать BooleanQuery, и он мне больше не нужен 🙂

Ответ №1:

Логические операторы должны быть ПРОПИСНЫМИ. То есть: java OR php правильно, java or php нет.

Чтобы точно объяснить, что происходит, без or прописных букв, это рассматривается как еще один термин. Поскольку AND он является оператором по умолчанию, это делает его:

 java AND or AND php
 

или что-то вроде

  (title:java)  (title:or)  (title:php)
 

Однако or это стандартное стоп-слово, и поэтому оно будет устранено во время анализа запроса, и вам остается просто:

  (title:java)  (title:php)