Lucene5.2中的QueryWrapperFilter用法

来源:互联网 发布:网络教学人物素描视频 编辑:程序博客网 时间:2024/04/27 06:21

Lucene5.2版本中 废弃掉了BooleanFilter,改用QueryWrapperFilter包装BooleanQuery的方式实现过滤的功能

示例代码如下:

//Filter因为也不再推荐使用,所以用Query替代。我将下面这个//BooleanQuery称做filter,并添加两个需要过滤的域BooleanQuery filter = new BooleanQuery();        filter.add(new TermQuery(new Term("过滤域A","过滤值")), Occur.MUST);        filter.add(new TermQuery(new Term("过滤域B","过滤值")), Occur.MUST);//接下来用QueryWrapperFilter包装这个BooleanQuery filterQueryWrapperFilter wFilter = new QueryWrapperFilter(filter);//好了,wFilter就相当于一个老版本中的BooleanFilter了

但是,我们在调用IndexSearcher 的 search()方法时,参数值包括filter的重载方法都弃用了,只允许我们传入query,要如何使用我们刚刚包装好的wFilter呢,很简单,用一个BooleanQuery将这个wFilter包含进去

示例:

//创建一个BooleanQuery 将wFilter包装进去,//这个query中就包含了我们之前需要的过滤器了,//注意BooleanClause必须使用Occur.FILTERBooleanQuery query = new BooleanQuery();        query.add(wFilter,Occur.FILTER);//添加普通情况的query到我们刚刚创建的BooleanQuery中去        query.add(new TermQuery(new Term("普通查询c","查询值")), Occur.MUST);//打印这个querySystem.out.println(query.toString());

打印结果

#QueryWrapperFilter(+过滤域A:过滤值 +过滤域B:过滤值) +普通查询c:查询值

上面的结果看这个查询条件中就包括了我们需要过滤的域以及查询的值

ps
BooleanClause中包含了Occur枚举,我们用来约束不同查询条件之间的关联关系

public static enum Occur {//must表示查询条件中必须包含    MUST     { @Override public String toString() { return "+"; } },//filter显然是和过滤器搭配使用的    FILTER   { @Override public String toString() { return "#"; } },//should表示该查询条件与其他查询条件是与的关系    SHOULD   { @Override public String toString() { return "";  } },//must_not表示查询条件中必须不包含在内    MUST_NOT { @Override public String toString() { return "-"; } };  }
0 0