Lucene過濾器的簡單實現

[java] view plaincopy
  1. package org.sam.demo.lucene;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.BitSet;  
  5.   
  6. import org.apache.lucene.index.IndexReader;  
  7. import org.apache.lucene.index.Term;  
  8. import org.apache.lucene.index.TermDocs;  
  9. import org.apache.lucene.search.Filter;  
  10. /** 
  11.  * @author Sam 
  12.  * @copyright_code 123456789987654321 
  13.  * @Date 2008-09-16 
  14.  * */  
  15. public class DynamicFilter extends Filter{  
  16.     public String fieldValue = "";  
  17.     public String fieldKey = "";  
  18.       
  19.       
  20.       
  21.     public DynamicFilter(String fieldKey,String security_advanced) {  
  22.         super();  
  23.         fieldValue = security_advanced;  
  24.         this.fieldKey = fieldKey;  
  25.     }  
  26.   
  27.   
  28.   
  29.     @Override  
  30.     public BitSet bits(IndexReader reader) throws IOException {  
  31.         /* 這個是過濾一個指定Term 返回其他 */  
  32.         final BitSet bits = new BitSet(reader.maxDoc());  
  33.         /* 設置一個 bits 的大小  */  
  34.         bits.set(0,bits.size()-1);  
  35.         Term term = new Term(fieldKey,fieldValue);  
  36.         TermDocs termDocs = reader.termDocs(term);  
  37.         while(termDocs.next()){  
  38.             bits.set(termDocs.doc(),false);  
  39.         }  
  40.         return bits;  
  41.           
  42.           
  43.         /* 這個是返回一個指定的 Term  */  
  44. /*      BitSet result=new BitSet(reader.maxDoc()); 
  45.         Term term = new Term(this.fieldKey,this.fieldValue); 
  46.         TermDocs td=reader.termDocs(term); 
  47.         while (td.next()) 
  48.         { 
  49.             result.set(td.doc()); 
  50.         }                        
  51.         return result; */  
  52.     }  
  53.   
  54. }  

 

[java] view plaincopy
  1. package org.sam.demo.lucene;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  6. import org.apache.lucene.index.CorruptIndexException;  
  7. import org.apache.lucene.index.Term;  
  8. import org.apache.lucene.queryParser.ParseException;  
  9. import org.apache.lucene.queryParser.QueryParser;  
  10. import org.apache.lucene.search.BooleanClause;  
  11. import org.apache.lucene.search.BooleanQuery;  
  12. import org.apache.lucene.search.Hits;  
  13. import org.apache.lucene.search.IndexSearcher;  
  14. import org.apache.lucene.search.Query;  
  15. import org.apache.lucene.search.TermsFilter;  
  16.   
  17. /** 
  18.  * @author Sam 
  19.  * @copyright_code 123456789987654321 
  20.  * @Date 2008-09-16 
  21.  * */  
  22. public class AdvancedSearch {  
  23.     private final String PATH="E:/Lucene/Index6/";  
  24.     /* 關於搜索lucene提供了很多類,基本上需要用的也不多,所以這裏我就寫一些比較常用的! */  
  25.     public static void main(String[] args) throws CorruptIndexException, IOException, ParseException {  
  26.         String[] keys = {"state","city"};  
  27.         String[] values = {"CA","Oakland"};  
  28.         new AdvancedSearch().booleanSerach(keys,values);  
  29.     }  
  30.       
  31.     public void booleanSerach(String[] keys,String[] values) throws CorruptIndexException, IOException, ParseException{  
  32.         QueryParser qp = null;  
  33.         BooleanQuery bq = null;  
  34.         IndexSearcher search = new IndexSearcher(PATH);  
  35.         for(int i = 0 ; i < keys.length ; i++){  
  36.             qp = new QueryParser(keys[i],new StandardAnalyzer());  
  37.             Query tq = qp.parse(values[i]);  
  38.             bq = new BooleanQuery();  
  39.             bq.add(tq, BooleanClause.Occur.MUST);  
  40.         }  
  41.         Term t = new Term("fname","Dirk");  
  42.         TermsFilter tf = new TermsFilter();  
  43.         tf.addTerm(t);  
  44.         Hits hits = search.search(bq,new DynamicFilter("fname","Dirk"));  
  45. //      Hits hits = search.search(bq,tf);  
  46.         System.out.println(hits.length());  
  47.         for(int i = 0 ; i < hits.length() ;i++){  
  48.             for(int j = 0 ; j < keys.length ; j++)  
  49.                 System.out.print(hits.doc(i).get(keys[j])+"  ");  
  50.             System.out.println();  
  51.         }  
  52.         search.close();  
  53.     }  
  54. }  
發佈了5 篇原創文章 · 獲贊 5 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章