lucene中ChainedFilter在findjar中的使用
2014-02-03 22:45
399 查看
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显示结果如下:
在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显示结果如下:
相关文章推荐
- Lucene使用Filter搜索过滤
- 关于使用Filter减少Lucene tf idf打分计算的调研
- 17、学习Lucene3.5索引之使用Filter(过滤器)搜索
- lucene4.5.0之filter使用
- Lucene使用Filter搜索过滤
- HTMLParser使用详解(3)- 通过Filter访问内容
- Lucene关系数据库的使用
- 使用Lucene的highlight包高亮显示检索关键字
- MVC用filter使用
- python学习笔记(九)函数式进阶:使用map、reduce、filter、sorted
- Lucene中使用Paoding中文分词
- MDX语法学习--filter与iif的使用
- 过滤器Filter的使用
- Spring使用OpenSessionInViewFilter解决Hibernate的lazy延时加载问题
- 使用Filter方式实现用Memcached储存Session
- Android中的Intent filter使用
- 【转载】使用Lucene.NET实现数据检索功能
- FilenameFilter使用方法介绍
- lucene学习总结篇--lucene全文检索的基本原理和lucene API简单的使用
- Lucene使用与优化1