如何使用Lucene搜索不包含术语的文档?

问题描述:

我知道,Lucene documentation如何使用Lucene搜索不包含术语的文档?

注意:NOT操作符不能只用一个学期使用。例如, 以下搜索将返回任何结果:

NOT“雅加达阿帕奇”

不过,我想能够形成返回不包含项的所有文档的查询。我已经考虑将MatchAllDocsQueryTermQuery连在一起成为BooleanQuery,但我似乎无法找到正确的组合。

如果我索引以下两个文件

Doc0: content:The quick brown fox jumps over the lazy dog. 
Doc1: (empty string) 

查询*:* -content:fox返回这两个文件时,我只想一个文档。

的RegexQuery content:^((?!fox).)*$建议由this * answer返回一个文档,但它似乎并没有被因为content:^((?!foo).)*$返回一个文档正常工作,以及时,我希望它返回两个文件。

我意识到我想要做的性能影响。查询只会在几个文档上运行,所以我不太在意性能。

有没有办法写一个Lucene查询来得到我想要的?

您可以使用匹配的一切,排除术语 -

IndexSearcher searcher = new IndexSearcher("path_to_index"); 
MatchAllDocsQuery everyDocClause = new MatchAllDocsQuery(); 
TermQuery termClause = new TermQuery(new Term("text", "exclude_term")); 
BooleanQuery query = new BooleanQuery(); 
query.add(everyDocClause, BooleanClause.Occur.MUST); 
query.add(termClause, BooleanClause.Occur.MUST_NOT); 
Hits hits = searcher.search(query); 

否则,有一个空场的一些固定值,并且使用查询

+dummy_field:dummy_value -exclude_term 
+0

你的答案都为我工作。 MatchAllDocsQuery是首选。起初,我实现了MatchAllDocsQuery,它没有工作,所以我问了这个问题。当我得到虚拟领域的工作时,我切换回MatchAllDocsQuery进行完整性检查,并且工作正常。我不知道为什么它以前不适合我。我必须得到一个错误的步骤。 – BennyMcBenBen

你不能为每个文档附加一个“人工”标记,然后搜索“'添加的标记'而不是'你想要避免的'”吗?