过滤Lucene结果而不是

时间:2014-05-20 13:58:08

标签: lucene

我试图从查询结果中过滤掉一些项目。

最终结果应该只包含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

有什么建议吗?

2 个答案:

答案 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));