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

Ben*_*Ben 2 java lucene

我知道Lucene的文档

注意:NOT运算符不能仅与一个术语一起使用.例如,以下搜索将不返回任何结果:

不是"jakarta apache"

但是,我希望能够形成一个返回所有不包含术语的文档的查询.我已经研究过将MatchAllDocsQueryTermQuery串联到一个BooleanQuery中,但我似乎找不到合适的组合.

如果我索引以下两个文件

Doc0: content:The quick brown fox jumps over the lazy dog.
Doc1: (empty string)
Run Code Online (Sandbox Code Playgroud)

*:* -content:fox当我只想要一个文档时,查询返回两个文档.

这个StackOverflow答案content:^((?!fox).)*$建议的RegexQuery 返回一个文档,但它似乎没有正常工作,因为当我希望它返回两个文档时也返回一个文档.content:^((?!foo).)*$

我知道我想要做的性能影响.查询只会在几个文档上运行,所以我不太担心性能.

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

Jay*_*dra 5

您可以使用匹配所有内容并排除术语 -

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);  
Run Code Online (Sandbox Code Playgroud)

否则,有一个虚拟字段,其中有一些固定值并使用查询

+dummy_field:dummy_value -exclude_term
Run Code Online (Sandbox Code Playgroud)