Lucene3.6小例子

        最近在學習Lucene,Lucene是一個開放源代碼的全文檢索引擎工具包。在網上找了一些小例子,無奈網上的資料大部分是2.0的,而我下的Lucene版本是3.6.2,由於很多API已經變了,因此程序報錯。於是跑去官網查了下Apache3.6的API,後來再查閱了網上的一些資料,終於把問題解決。在這裏貼上一個Lucene3.6的比較簡單的例子,希望可以幫到像我一樣處於初學階段的人。
    Lucene主要分爲兩部分,一部分是建立索引文件,另一部分是根據索引文件進行搜索查詢。

    先來看看建立索引的部分

import  java.io.BufferedReader;   
import  java.io.File;   
import  java.io.FileInputStream;   
import  java.io.IOException;   
import  java.io.InputStreamReader;   
import  org.apache.lucene.analysis.standard.StandardAnalyzer;
import  org.apache.lucene.document.Document;
import  org.apache.lucene.document.Field;
import  org.apache.lucene.document.Field.Index;
import  org.apache.lucene.document.Field.Store;
import  org.apache.lucene.index.IndexWriter;
import  org.apache.lucene.index.IndexWriterConfig;
import  org.apache.lucene.store.FSDirectory;
import  org.apache.lucene.util.Version;

public class LuceneTest {
        private static String ENCODE = "GBK";  
        /*
            讀取本地磁盤的待索引文件
        */
	public static String openFile(File szFileName) {
        try {
            BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream(szFileName), ENCODE) );
            String szContent="";
            String szTemp;
            
            while ( (szTemp = bis.readLine()) != null) {
                szContent+=szTemp+"\n";
            }
            bis.close();
            return szContent;
        }
        catch( Exception e ) {
            return "";
        }
    	}
        /*
             建立索引
        */
	public void test() throws IOException {
		File file = new File("G:/Workspaces/Eclipse/LuceneTest/indexdata");     //索引文件夾
		File ReadFile = new File("G:/Workspaces/Eclipse/Heritrix/jobs/360BuyIndexDatabase");     //待建立索引文件所在文件夾
		File[] textFiles = ReadFile.listFiles();      
		FSDirectory directory = FSDirectory.open(file);
		//用來創建索引
		IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_36,new StandardAnalyzer(Version.LUCENE_36));   
		IndexWriter writer = new IndexWriter(directory, conf);
		
		for(int i=0;i<textFiles.length;i++){
			if(textFiles[i].isFile()&&textFiles[i].getName().endsWith(".txt")){
				System.out.println("File"+textFiles[i].getCanonicalPath()+"正在被索引");
				String szContent = openFile(textFiles[i]);
                Document doc = new Document();
                Field FieldPath = new Field("path",textFiles[i].getPath(),Store.YES,Index.NO);  
                Field FieldBody =  new Field("content",szContent,Store.YES,Index.ANALYZED);  
                System.out.println(szContent);
                doc.add(FieldPath);   
                doc.add(FieldBody);   
                writer.addDocument(doc);   			
			}
		}		
		writer.close();//關閉writer索引纔會寫到磁盤上
	    
}
	
	public static void main(String[] args) throws IOException {
		LuceneTest Test = new LuceneTest();
		Test.test();
	}
}


           下面是根據已經建立的索引文件進行搜索查詢部分

          

import java.io.File;
import java.io.IOException;
import java.util.Date; 

import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.queryParser.ParseException;   
import org.apache.lucene.queryParser.QueryParser; 
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.util.Version;
import org.apache.lucene.search.Query;


public class LuceneSearch{
	public void Search()throws IOException{
	        File file = new File("G:/Workspaces/Eclipse/LuceneTest/indexdata");       //索引所在文件夾
		FSDirectory directory = FSDirectory.open(file);
		IndexReader reader = IndexReader.open(directory);  
	    //簡單索引  
	    IndexSearcher searcher = new IndexSearcher(reader);  
	    
	    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);        
	    try{
	    QueryParser qp = new QueryParser(Version.LUCENE_36,"content",analyzer);  
	    Query query = qp.parse("程序");       //搜索內容
	    ScoreDoc[] docs = searcher.search(query, 5).scoreDocs;   //最匹配的前五個文檔

	    for(int i = 0; i < docs.length; i++) {  
	        Date start = new Date();  
	        String content = searcher.doc(docs[i].doc).get("content");  
	        Date end = new Date();  
	        System.out.println(content + (end.getTime() - start.getTime()) + "ms");   
	    }  
	    }catch(ParseException e){	    	
	    }
	}
	public static void main(String[] args)throws IOException{
		
		LuceneSearch ls = new LuceneSearch();
		ls.Search();
	}
}

搜索結果:


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