为什么Lucene(Hibernate搜索)忽略了我自己的操作员?
我最近将Hibernate搜索更新为5.0.0.Alpha4,它使用Lucene 4.8.1 我仍然像以前一样使用相同的代码来创建搜索查询(更新之前我使用了Lucene 3.3,它是一个非常旧的版本:))。但我注意到一个问题,新版本只是忽略了我的运算符,一直使用默认运算符,但旧版本的代码运行良好: 例如:现在我将“AND”设置为默认运算符。我只是在搜索字段中键入了“java或php”。我在queryParser.parse(searchString)的行中做了一个断点。它告诉我,我的搜索字符串现在是“java或php”,这是正确的。但是在queryParser.parse()之后创建的searchQuery是: 这意味着Lucene将我的搜索字符串处理为“AND”逻辑 我不知道这是新Lucene的bug还是我做错了什么 代码如下:为什么Lucene(Hibernate搜索)忽略了我自己的操作员?,lucene,hibernate-search,Lucene,Hibernate Search,我最近将Hibernate搜索更新为5.0.0.Alpha4,它使用Lucene 4.8.1 我仍然像以前一样使用相同的代码来创建搜索查询(更新之前我使用了Lucene 3.3,它是一个非常旧的版本:))。但我注意到一个问题,新版本只是忽略了我的运算符,一直使用默认运算符,但旧版本的代码运行良好: 例如:现在我将“AND”设置为默认运算符。我只是在搜索字段中键入了“java或php”。我在queryParser.parse(searchString)的行中做了一个断点。它告诉我,我的搜索字符串现
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);
。也就是说:java或php
是正确的,java或php
不是
为了准确地解释发生了什么,在不使用大写字母的情况下,它被视为另一个术语。由于和
是默认运算符,因此:
java AND or AND php
或者,类似于
+(title:java) +(title:or) +(title:php)
但是,或
是一个标准的停止词,因此在分析查询时,它将被删除,只剩下:
+(title:java) +(title:php)
我假设你不是在搜索“A和B”。这就是全部吗?
布尔查询的作用是什么?另外,试着在运行查询之前查看一下searchQuery.toString()
的外观,由于某种原因,它可能不是您所期望的。@queryParser.parse(searchString)断点处的femtoRgon我检查过的searchString仍然是“A和B”。但是删除BooleanQuery的一部分以再次测试它确实是一个好主意。我现在就去试试。谢谢大家!<代码>搜索字符串并不是我真正想问的Query.toString
不仅仅是回退传递给QueryParser
的字符串。我想知道在解析和分析之后生成的查询实际上是什么样子的。另外,如果这是您的实际代码,那么删除BooleanQuery
不会解决您的问题,因为它从未被使用过。这与您实际运行的代码不同吗?@femtoRgon我刚刚编辑了这个问题,现在您将看到创建的查询是什么样子的。是的,我只是注意到我忘了使用BooleanQuery,我不再需要它了:)
+(title:java) +(title:php)