我知道Lucene的文档说
注意:NOT运算符不能仅与一个术语一起使用.例如,以下搜索将不返回任何结果:
不是"jakarta apache"
但是,我希望能够形成一个返回所有不包含术语的文档的查询.我已经研究过将MatchAllDocsQuery和TermQuery串联到一个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查询来获得我想要的东西?
您可以使用匹配所有内容并排除术语 -
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)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |