lucene Filter過濾器

不知為何就叫呵呵發表於2016-12-30

摘自: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;  
    }  

 

相關文章