Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Hibernate Lucene查询解析器_Hibernate_Search_Lucene_Hibernate Search - Fatal编程技术网

Hibernate Lucene查询解析器

Hibernate Lucene查询解析器,hibernate,search,lucene,hibernate-search,Hibernate,Search,Lucene,Hibernate Search,我目前正试图在Lucene中完成一些全文查询。我希望达到以下目标: 在得到一个搜索词时,如 “你好,世界” 我想要一个在所有字段中搜索这两个术语的查询。但是,这两个术语不必只出现在一个字段中,而必须出现在所有字段中 因此,结果应该如下所示: +(field1:hello field2:hello)+(field1:world field2:world) 使用多字段QueryParser时,我只得到以下信息: (+field1:hello+field1:world)(+field2:hello+f

我目前正试图在Lucene中完成一些全文查询。我希望达到以下目标:

在得到一个搜索词时,如

“你好,世界”

我想要一个在所有字段中搜索这两个术语的查询。但是,这两个术语不必只出现在一个字段中,而必须出现在所有字段中

因此,结果应该如下所示:

+(field1:hello field2:hello)+(field1:world field2:world)

使用多字段QueryParser时,我只得到以下信息:

(+field1:hello+field1:world)(+field2:hello+field2:world)

据我所知,这要求每个术语只出现在一个字段中

是否有机会使用默认的Lucene特性实现这种行为,或者我必须实现自己的查询解析器

我目前的方法是将域对象上的所有字段内容连接到一个字段中,然后只查询该字段。然而,这种方法是相当丑陋的

谢谢,
马蒂亚斯

我绝对不同意你目前的做法是丑陋的。我发现,将所有内容收集到everything字段中是实现“随时随地查找”搜索的最干净的方法

但是,如果手动连接字段,可能会有点混乱。相反,您可以添加具有相同名称的多个字段,这些字段将在索引中有效地连接起来。比如:

//Don't actually construct your fields this way.
//Just cutting out some of the boilerplate for simplicity.
document.add(new Field("field1", firstvalue));
document.add(new Field("everything", firstvalue));
document.add(new Field("field2", nextvalue));
document.add(new Field("everything", nextvalue));
这将很好地将其全部应用于同一领域。一般来说,只要没有存储“everything”字段(当然不应该存储),这对索引大小的影响应该很小,并且应该表现良好。我之前刚刚创建了一个实用程序调用,它将该字段添加到文档中,并将其透明地添加到“everything”或“all”字段中,以便索引任何内容

对于这种情况,请查看Solr文档,通过使用其
copyField
schema元素,他们可以在这些文档中找到它们


如果您确实想使用
多字段QueryParser
,则可能需要单独解析子查询,并使用布尔查询将它们连接起来,如:

BooleanQuery bq = new BooleanQuery();
bq.add(new BooleanClause(multifieldQP.parse("hello"), BooleanClause.Occur.MUST));
bq.add(new BooleanClause(multifieldQP.parse("world"), BooleanClause.Occur.MUST));
searcher.search(bq);

但是,如果用户输入了查询,那么将其分解以自动处理会有很多复杂性。同样,我会坚持你目前正在做的事情。

回答得很好,谢谢!我将继续使用复合字段,但必须将store属性设置为“no”。你是对的-最好直接计算属性。。。谢谢