2010-08-30 74 views
7

我需要不在我的lucene索引上查询。 Lucene的目前允许不仅当我们在查询两个或多个方面:不在lucene中查询

所以我可以这样做:

country:canada not sweden 

,但我不能运行一个查询,如:

country:not sweden 

请您告诉我是否有针对此问题的一些有效解决方案

谢谢

回答

1

简短的回答是,这是不可能使用标准的Lucene。

Lucene不允许将NOT查询作为一个单词出于同样的原因,它不允许前缀查询 - 要执行,引擎将不得不查看每个文档以确定文档是否不是命中。它必须浏览每个文档,因为它不能使用搜索项作为在倒排索引(用于存储索引文档)中查找文档的关键。

要接你的案子为例:

要搜索not sweden,最简单的(也可能是最有效的)方法是寻找sweden,然后“反转”的结果集返回的所有文件不在该结果集中。这样做需要找到索引中所有必需的(即不在结果集中)文档,但是没有一个键可以查找它们。这可以通过遍历索引中的文档来完成 - 它不是优化的任务,因此速度会受到影响。

如果你真的需要这个功能,你可以建立索引时,维护自己的项目列表,从而使not sweden搜索成为使用Lucene一个sweden搜索,然后用你的项目组结果的反转。

16

非常晚的答复,但它可能是有用的人后来其他:如果我没有记错的话这应该做

*:* AND NOT country:sweden 

逻辑“与”所有文件和文件与一个国家不同于“瑞典”。

1

好的,我明白你在做什么。

由于Lucene中没有一元布尔运算符,因此可以将它用作查询优化。尽管有上述问题的答案,我相信这是一个更好的和最前沿的做法(注意通配符前的空格):

&query= *&qf=-country:Canada