Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Lucene(Hibernate搜索)忽略了我自己的操作员?_Lucene_Hibernate Search - Fatal编程技术网

为什么Lucene(Hibernate搜索)忽略了我自己的操作员?

为什么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)的行中做了一个断点。它告诉我,我的搜索字符串现

我最近将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还是我做错了什么

代码如下:

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)