lucene中ChainedFilter在findjar中的使用

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顯示結果如下:




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章