1

我目前正在尝试在 Lucene 中完成一些全文查询。我想要达到的目标如下:

在获得类似的搜索词后

“你好与世界”

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

因此,结果应如下所示:

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

使用 MultiFieldQueryParser 时,我只得到以下信息:

(+field1:你好 +field1:world) (+field2:你好 +field2:world)

据我了解,这要求每个术语只出现在一个领域。

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

我目前的方法是将域对象上的所有字段内容仅连接到一个字段中并仅查询该字段。但是,这种方法非常丑陋...

谢谢, 马蒂亚斯

4

1 回答 1

0

我绝对不同意你目前的方法是丑陋的。我发现将所有内容收集到所有字段中是启用随处查找搜索的最简洁方法。

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

//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));

可以很好地把它全部放到同一个领域。一般来说,只要不存储“一切”字段(当然不应该存储),这对索引大小的影响应该很小,并且应该表现良好。我之前刚刚创建了一个实用程序调用,该调用将字段添加到文档中,并将其透明地添加到“所有”或“所有”字段中,以用于任何被索引的内容。

查看 Solr 文档,他们通过使用他们的模式元素来推荐这种模式,以应对这种情况。copyField


如果您真的想使用MultiFieldQueryParser,您可能需要单独解析子查询,并使用 booleanQuery 将它们连接起来,例如:

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);

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

于 2013-05-09T17:00:07.867 回答