我最近将我的Hibernate Search更新为5.0.0.Alpha4,它使用了Lucene 4.8.1。
我仍然像以前一样使用相同的代码来创建我的搜索查询(我在更新之前使用了Lucene 3.3,这是一个非常老的版本:))。但是我注意到一个问题,新版本只是忽略了我的操作符并且一直使用默认操作符,但代码在旧版本中工作正常:
例如:现在我设置" AND"作为默认运营商。我刚输入" java或php"在搜索字段中。我在queryParser.parse(searchString)的行中创建了一个断点。它告诉我,我的searchString现在是" java或php",这是正确的。但是queryParser.parse()之后创建的searchQuery是:
+(title:java) +(title:php)
这意味着Lucene将我的searchString作为" AND" LOGIC!
我不知道这是一个新的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);
答案 0 :(得分:2)
Boolean Operators must be in CAPS。这是:java OR php
是正确的,java or php
不是。
为了准确地解释发生了什么,没有or
被限制,它被视为另一个术语。如果AND
是默认运算符,则会生成:
java AND or AND php
或类似
+(title:java) +(title:or) +(title:php)
但是,or
是一个标准的停用词,因此在分析查询时会被删除,您只需简单地说:
+(title:java) +(title:php)