如何使用Lucene搜索不包含术语的文档?
问题描述:
我知道,Lucene documentation说如何使用Lucene搜索不包含术语的文档?
注意:NOT操作符不能只用一个学期使用。例如, 以下搜索将返回任何结果:
NOT“雅加达阿帕奇”
不过,我想能够形成返回不包含项的所有文档的查询。我已经考虑将MatchAllDocsQuery和TermQuery连在一起成为BooleanQuery,但我似乎无法找到正确的组合。
如果我索引以下两个文件
Doc0: content:The quick brown fox jumps over the lazy dog.
Doc1: (empty string)
查询*:* -content:fox
返回这两个文件时,我只想一个文档。
的RegexQuery content:^((?!fox).)*$
建议由this StackOverflow 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
答
你不能为每个文档附加一个“人工”标记,然后搜索“'添加的标记'而不是'你想要避免的'”吗?
你的答案都为我工作。 MatchAllDocsQuery是首选。起初,我实现了MatchAllDocsQuery,它没有工作,所以我问了这个问题。当我得到虚拟领域的工作时,我切换回MatchAllDocsQuery进行完整性检查,并且工作正常。我不知道为什么它以前不适合我。我必须得到一个错误的步骤。 – BennyMcBenBen