注意:NOT运算符不能仅与一个术语一起使用。例如, 以下搜索将不返回任何结果:
不是“jakarta apache”
但是,我希望能够形成一个返回所有不包含术语的文档的查询。我已经考虑将MatchAllDocsQuery和TermQuery串联到一个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查询来获得我想要的东西?
答案 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)
你不能在每个文件上附加一个“人工”标记然后搜索“'添加标记'而不是'你想避免什么'”吗?