摘自:http://iamyida.iteye.com/blog/2199368
1.TermFilter:就是按照Term去過濾,跟TermQuery類似:
Filter filter = new TermFilter(new Term("subject","junit"));
2.TermsFilter:它是用來進行多Term過濾的,是相對於TermFilter的:
Filter filter = new TermsFilter(new Term[] { new Term("subject","lucene"), new Term("pubmonth","201005") });
3.FieldValueFilter:僅僅是對單個域進行過濾,即只返回包含指定域的索引文件,對域值沒有進行限定
//negate表示是否取反,預設是包含指定域,取反意思就是不包含指定域 Filter filter = new FieldValueFilter("category", false);
4.BooleanFilter:用來連結多個Filter的,類似於BooleanQuery
BooleanFilter booleanFilter = new BooleanFilter(); booleanFilter.add(filter1, Occur.MUST); booleanFilter.add(filter2, Occur.MUST);
MUST:表示必須符合
MUST_NOT:與MUST相對應,取MUST的否定,即必須不符合
SHOULD:在英語表示一種很委婉的語氣,即可以的意思,不是強制性的,即可有可無的意思.
5.QueryWrapperFilter:用來把Query包裝成一個Filter
Query query = new TermQuery(new Term("title","junit")); //把一個Query物件包裝成一個Filter物件 Filter filter1 = new QueryWrapperFilter(query); //title域中a-j範圍內的,包含a,j兩個邊界 Filter filter2 = TermRangeFilter.newStringRange("title", "a", "j", true, true); BooleanFilter booleanFilter = new BooleanFilter(); booleanFilter.add(filter1, Occur.MUST); booleanFilter.add(filter2, Occur.MUST);
6.DuplicateFilter:用來去除重複索引文件的
7.MultiTermQueryWrapperFilter:把MultiTermQuery包裝成一個Filter,其下面派生了很多子Filter
TermRangeFilter:用進行字串型Field的範圍過濾的,跟TermRangeQuery用法類似,只是Filter不進行打分操作
Filter filter2 = TermRangeFilter.newStringRange("title", "a", "j", true, true);
NumericRangeFilter:對數字域進行範圍過濾的Filter,跟NumericRangeQuery很類似
Filter filter2 = NumericRangeFilter.newIntRange("pubmonth", 199908, 201005, true, true);
PrefixFilter:與PrefixQuery對應,即過濾出以xxxx打頭的索引文件
Filter filter2 = new PrefixFilter(new Term("title","lucene"));
8.DocValuesRangeFilter:用來進行範圍過濾的,DocValuesRangeFilter是與DocValuesFiled域對應的,即它只適用於對DocValuesFiled進行範圍過濾,它不能直接透過建構函式進行構建,它是透過內部提供的靜態方法來構建的
//先把搜尋範圍限定在 pubmonth in[199901 to 201005]的索引文件 Filter filter = DocValuesRangeFilter .newIntRange("pubmonth", 199901, 201005, true, true);
9.CachingWrapperFilter:包裝類,即把Filter包裝為一個包含快取功能的Filter,也是典型的裝飾者模式,SegmentCoreReaders就是把當前的indexReader的克隆物件快取了一份,其實就是key是和當前的indexReader對應的,所以在用CachingWrapperFilter的時候,你要保證前後兩次你使用的是同一個IndexReader物件,只有這樣你使用CachingWrapperFilter才會利用到快取,否則你還是會重新去執行Filter的過濾操作。
Filter filter = new CachingWrapperFilter(new TermFilter(new Term("subject","junit")));
10.自定義過濾器:繼承Filter基類
public class MyCustomFilter extends Filter{ public MyCustomFilter() { // TODO Auto-generated constructor stub } private String[] terms;//限制返回的資料字典 public MyCustomFilter(String ...terms) { // TODO Auto-generated constructor stub this.terms=terms; } @Override public DocIdSet getDocIdSet(AtomicReaderContext arg0, Bits arg1) throws IOException { FixedBitSet bits=new FixedBitSet(arg0.reader().maxDoc()) ;//獲取沒有所有的docid包括未刪除的 int base=arg0.docBase;//段的相對基數,保證多個段時相對位置正確 //int limit=base+arg0.reader().maxDoc();//計算最大限制值 for(String s:terms){ DocsEnum doc=arg0.reader().termDocsEnum(new Term("id", s));//必須是唯一的不重複 //保證是單個不重複的term,如果重複的話,預設會取第一個作為返回結果集,分詞後的term也不適用自定義term if(doc.nextDoc()!=-1){ bits.set(doc.docID());//對付符合條件約束的docid迴圈新增到bits裡面 } } return bits; }