#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)