天天看點

Lucene入門示例

主要參考了Lucene的官方示例

Lucene入門示例

環境:Win7 + JDK1.6 + Eclipse37 

Lucene版本:3.5 

官方: http://www.apache.org/dyn/closer.cgi  

檢索的基本概念 

一 資訊檢索:從資訊集合中打找出與使用者相關的資訊.  

1  資訊檢索的分類 

全文檢索 :把使用者的查詢請求和全文中的每一個詞進行比較不考慮查詢請求與文本語義的比對。 

資料檢索 :查詢要求和資訊系統中的資料都有一定的結構,語義比對能力差. 

知識檢索 :強調基于知識語義上的比對 

說明以下介紹來自于百科名片, http://baike.baidu.com/view/371811.htm  

二 Lucene介紹  

Lucene是apache軟體基金會jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎.Lucene的原作者是Doug Cutting,他是一位資深全文索引/檢索專家. 

優點如下: 

1 索引檔案格式獨立于應用平台。Lucene定義了一套以8位位元組為基礎的索引檔案格式,使得相容系統或者不同平台的應用能夠共享建立的索引檔案。、 

2 在傳統全文檢索引擎的反向索引的基礎上,實作了分塊索引,能夠針對新的檔案建立小檔案索引,提升索引速度。 

3 設計了獨立于語言和檔案格式的文本分析接口,索引器通過接受Token流完成索引檔案的創立,使用者擴充新的語言和檔案格式,隻需要實作文本分析的接口。 

4 Lucene的查詢實作中預設實作了布爾操作、模糊查詢(Fuzzy Search[11])、分組查詢等. 

三 工程圖檔如下,所用jar檔案包含:lucene-core-3.5.0.jar,lucene-analyzers-3.5.0.jar. 

Lucene入門示例

四 想要搜尋任何内容,必須先收集資料,建立索引庫,之後才能進行搜尋。 

具體實作類如下: 

Java代碼  

Lucene入門示例
  1. package net.liuzd.lucene.test;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import org.apache.lucene.document.Document;  
  5. import org.apache.lucene.document.Field;  
  6. import org.apache.lucene.index.CorruptIndexException;  
  7. import org.apache.lucene.index.IndexWriter;  
  8. import org.apache.lucene.index.IndexWriterConfig;  
  9. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  10. import org.apache.lucene.index.Term;  
  11. import org.apache.lucene.search.Filter;  
  12. import org.apache.lucene.search.IndexSearcher;  
  13. import org.apache.lucene.search.Query;  
  14. import org.apache.lucene.search.ScoreDoc;  
  15. import org.apache.lucene.search.TopDocs;  
  16. import org.junit.Test;  
  17. public class IndeSearchFiles {  
  18.     @Test  
  19.     public void createIndex() throws Exception{  
  20.         //操作增,删,改索引庫的  
  21.         IndexWriter writer = LuceneUtils.createIndexWriter(OpenMode.CREATE);          
  22.         //資料源的位置  
  23.         File sourceFile = LuceneUtils.createSourceFile();  
  24.         System.out.println("檔案路徑:" + sourceFile.getAbsolutePath());  
  25.         //進行寫入文檔          
  26.         Document doc = new Document();  
  27.          doc.add(new Field("name",sourceFile.getName(),Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));  
  28.         //檔案路徑  
  29.         Field pathField = new Field("path", sourceFile.getPath(), Field.Store.YES, Field.Index.NO);  
  30.         pathField.setIndexOptions(org.apache.lucene.index.FieldInfo.IndexOptions.DOCS_ONLY);  
  31.         doc.add(pathField);  
  32.         //檔案最後修改時間  
  33.         doc.add(new Field("modified",String.valueOf(sourceFile.lastModified()),Field.Store.YES, Field.Index.NO));  
  34.         //添加檔案内容  
  35.         String content = LuceneUtils.readFileContext(sourceFile);  
  36.         System.out.println("content: " + content);  
  37.         doc.add(new Field("contents",content,Field.Store.YES, Field.Index.ANALYZED));  
  38.         //以下是官網的實作  
  39.         if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE)  
  40.         {  
  41.            writer.addDocument(doc);  
  42.         }  
  43.         else  
  44.         {  
  45.           writer.updateDocument(new Term("path", sourceFile.getPath()), doc);  
  46.         }         
  47.         //釋放資源  
  48.         writer.close();  
  49.        // fis.close();  
  50.     }  
  51.     @Test  
  52.     public void search() throws Exception{  
  53.         //查詢的字元串:輸入不存在的字元串是查詢不到的,如:中國  
  54.         String queryString = "Lucene";  
  55.         //查詢字段集合  
  56.         String [] queryFileds = {"contents"};         
  57.         IndexSearcher searcher = LuceneUtils.createIndexSearcher();       
  58.         Query query = LuceneUtils.createQuery(queryFileds, queryString);  
  59.         //在搜尋器中進行查詢  
  60.         //對查詢内容進行過濾  
  61.         Filter filter = null;  
  62.         //一次在索引器查詢多少條資料  
  63.         int queryCount = 100;  
  64.         TopDocs results = searcher.search(query,filter,queryCount);  
  65.         System.out.println("總符合: " + results.totalHits + "條數!");  
  66.         //顯示記錄  
  67.         for(ScoreDoc sr : results.scoreDocs){  
  68.             //文檔編号  
  69.             int docID = sr.doc;  
  70.             //真正的内容  
  71.             Document doc = searcher.doc(docID);  
  72.             System.out.println("name = " + doc.get("name"));  
  73.             System.out.println("path = " + doc.get("path"));  
  74.             System.out.println("modified = " + doc.get("modified"));  
  75.             System.out.println("contents = " + doc.get("contents"));              
  76.         }         
  77.     }  
  78. }  

工具類代碼如下: 

Java代碼  

Lucene入門示例
  1. package net.liuzd.lucene.test;  
  2. import java.io.BufferedReader;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStreamReader;  
  7. import org.apache.lucene.analysis.Analyzer;  
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  9. import org.apache.lucene.index.CorruptIndexException;  
  10. import org.apache.lucene.index.IndexReader;  
  11. import org.apache.lucene.index.IndexWriter;  
  12. import org.apache.lucene.index.IndexWriterConfig;  
  13. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  14. import org.apache.lucene.queryParser.MultiFieldQueryParser;  
  15. import org.apache.lucene.queryParser.ParseException;  
  16. import org.apache.lucene.queryParser.QueryParser;  
  17. import org.apache.lucene.search.IndexSearcher;  
  18. import org.apache.lucene.search.Query;  
  19. import org.apache.lucene.store.Directory;  
  20. import org.apache.lucene.store.FSDirectory;  
  21. import org.apache.lucene.util.Version;  
  22. public class LuceneUtils {  
  23.     //目前目錄位置  
  24.     public static final String USERDIR = System.getProperty("user.dir");  
  25.     //存放索引的目錄  
  26.     private static final String INDEXPATH = USERDIR + File.separator + "index";  
  27.     //資料源  
  28.     private static final String INDEXSOURCE = USERDIR + File.separator  
  29.             + "source" + File.separator + "lucene.txt";  
  30.     //使用版本  
  31.     public static final Version version = Version.LUCENE_35;  
  32.     public static Analyzer getAnalyzer(){  
  33.         // 分詞器  
  34.         Analyzer analyzer = new StandardAnalyzer(version);  
  35.         return analyzer;  
  36.     }  
  37.     public static IndexWriter createIndexWriter(OpenMode openMode)  
  38.             throws Exception {  
  39.         // 索引存放位置設定  
  40.         Directory dir = FSDirectory.open(new File(INDEXPATH));        
  41.         // 索引配置類設定  
  42.         IndexWriterConfig iwc = new IndexWriterConfig(version,  
  43.                 getAnalyzer());  
  44.         iwc.setOpenMode(openMode);  
  45.         IndexWriter writer = new IndexWriter(dir, iwc);  
  46.         return writer;  
  47.     }  
  48.     public static IndexSearcher createIndexSearcher() throws CorruptIndexException, IOException {  
  49.         IndexReader reader = IndexReader.open(FSDirectory.open(new File(INDEXPATH)));  
  50.         IndexSearcher searcher = new IndexSearcher(reader);  
  51.         return searcher;  
  52.     }  
  53.     public static Query createQuery(String [] queryFileds,String queryString) throws ParseException{  
  54.          QueryParser parser = new MultiFieldQueryParser(version, queryFileds, getAnalyzer());  
  55.          Query query = parser.parse(queryString);  
  56.          return query;  
  57.     }  
  58.     public static String readFileContext(File file){  
  59.         try {  
  60.             BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));  
  61.             StringBuilder content = new StringBuilder();  
  62.             for(String line = null; (line = br.readLine())!= null;){  
  63.                 content.append(line).append("\n");  
  64.             }  
  65.             return content.toString();  
  66.         } catch (Exception e) {  
  67.             throw new RuntimeException(e);  
  68.         }  
  69.     }  
  70.     public static void main(String[] args) {  
  71.         System.out.println(Thread.currentThread().getContextClassLoader()  
  72.                 .getResource(""));  
  73.         System.out.println(LuceneUtils.class.getClassLoader().getResource(""));  
  74.         System.out.println(ClassLoader.getSystemResource(""));  
  75.         System.out.println(LuceneUtils.class.getResource(""));  
  76.         System.out.println(LuceneUtils.class.getResource("/")); // Class檔案所在路徑  
  77.         System.out.println(new File("/").getAbsolutePath());  
  78.         System.out.println(System.getProperty("user.dir"));  
  79.     }  
  80.     public static File createSourceFile() {  
  81.         File file = new File(INDEXSOURCE);  
  82.         return file;  
  83.     }  
  84. }  

附件有工程源碼與jar檔案

Lucene入門示例

繼續閱讀