lucene中ChainedFilter在findjar中的使用

11 篇文章 0 订阅
1 篇文章 0 订阅

Lucene中使用ChainedFilter可以将多个过滤器Filter链接起来,而且可以在过滤器中执行AND、OR、XOR和ANDNOT的位操作。

http://www.findmaven.net中就用到了这个ChainedFilter。查询结果出现多个版本的同个jar,页面显示只需要最高版本

IndexReader reader = IndexReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);

Query query = new TermQuery(new Term("artifact", "spring-core")); //查询arttifact=spring-core
DuplicateFilter filter1 = new DuplicateFilter("fname");
DuplicateFilter filter2 = new DuplicateFilter("group");  //过滤掉artifact=spring-core的相同group

filter2.setKeepMode(DuplicateFilter.KM_USE_FIRST_OCCURRENCE);
ChainedFilter filters = new ChainedFilter(new Filter[] { filter1,filter2 }, ChainedFilter.AND);  //两个filter做与操作

TopDocs docs = searcher.search(query, filters, Integer.MAX_VALUE);

那如何只显示最高版本,过滤掉低版本呢?可以在查询结果中按照版本高低排序

Sort sort = new Sort();
sort.setSort(new SortField("version", SortField.STRING, false));

然后就可以在DuplicateFilter("group")过滤掉除第一个之外的结果。


这里还需要介绍DuplicateFilter,其中有两个重要的参数

keepMode:

KM_USE_FIRST_OCCURRENCE表示重复的文档取第一篇

KM_USE_LAST_OCCURRENCE表示重复的文档取最后一篇


processingMode:

PM_FULL_VALIDATION是首先将bitset中所有文档都设为false,当出现同组重复文章的第一篇的时候,将其设为1

PM_FAST_INVALIDATION是首先将bitset中所有文档都设为true,除了同组重复文章的第一篇,其他的的全部设为0


DuplicateFilter源码中默认使用KM_USE_LAST_OCCURRENCE

public DuplicateFilter(String fieldName){
this(fieldName, KM_USE_LAST_OCCURRENCE,PM_FULL_VALIDATION);
}

因为我们的sort是按照版本从高到低排序,我们只取第一个最高版本,所以我们必须指定

filter2.setKeepMode(DuplicateFilter.KM_USE_FIRST_OCCURRENCE);


http://www.findmaven.net显示结果如下:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值