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

时间:2011-11-04 15:15:34

标签: java lucene

我知道Lucene documentation

  

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

     

不是“jakarta apache”

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

如果我索引以下两个文件

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

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

this StackOverflow answer建议的RegexQuery content:^((?!fox).)*$会返回一个文档但它似乎无法正常工作,因为content:^((?!foo).)*$在我希望它返回两个文档时也返回一个文档。< / p>

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

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

2 个答案:

答案 0 :(得分: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);  

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

+dummy_field:dummy_value -exclude_term

答案 1 :(得分:1)

你不能在每个文件上附加一个“人工”标记然后搜索“'添加标记'而不是'你想避免什么'”吗?