我试图从查询结果中过滤掉一些项目。
最终结果应该只包含Private设置为false或者如果为true的结果,它们是提供的隐私组的一部分
我们说基本的查询结果就是这个
ID Name Private PrivacyGroup
1 Yellow false
2 Red true 1
3 Blue true 2
4 Orange true 1
5 Black false
6 Green true 3
我尝试了各种过滤器,但这似乎是我认为应该有效的过滤器,它不是:
BooleanQuery bq = new BooleanQuery();
BooleanQuery privacyQuery = new BooleanQuery();
BooleanQuery privacyFinalQuery = new BooleanQuery();
privacyFinalQuery.add(new TermQuery(new Term("Private", "true")),Occur.MUST);
for(String i : suppliedGroups){
privacyQuery.add(new TermQuery(new Term("PrivacyGroup", i)), Occur.SHOULD);
}
privacyFinalQuery.add(groupQuery, Occur.MUST_NOT);
bq.add(privacyFinalQuery, Occur.MUST_NOT);
return new CachingWrapperFilter(new QueryWrapperFilter(bq));
这导致
(-(+Private:true -(PrivacyGroup:1 PrivacyGroup:2)))
最终结果是0结果,我希望:1,2,3,4,5
有什么建议吗?
答案 0 :(得分:0)
您的查询完全是否定的,并且实际上并不匹配任何文档。
您应该添加MatchAllDocsQuery
作为第一个子句,并通过提供否定查询进一步过滤它。
尝试添加以下行:
bq.add(new MatchAllDocsQuery(), Occur.MUST);
答案 1 :(得分:0)
将纯正否定查询与MatchAllDocsQuery
作为前缀,是的。它的表现非常糟糕,但它确实起到了作用。
看起来构建查询的方式与您陈述问题的方式相同,但这会导致更简单,更少hacky的实现:
私有设置为false或如果为true,则是提供的隐私组的一部分
所以,你想要private = false或group = 1或group = 2,这可以更简单地说:
(Private:false PrivacyGroup:1 PrivacyGroup:2)
或者,
BooleanQuery privacyQuery = new BooleanQuery();
privacyQuery.add(new TermQuery(new Term("Private", "false")),Occur.SHOULD);
for(String i : suppliedGroups){
privacyQuery.add(new TermQuery(new Term("PrivacyGroup", i)), Occur.SHOULD);
}
return new CachingWrapperFilter(new QueryWrapperFilter(privacyQuery));