为什么Lucene(Hibernate Search)会忽略我自己的运算符?

时间:2014-06-20 15:25:48

标签: lucene hibernate-search

我最近将我的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);

1 个答案:

答案 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)