初探Lucene

壹頁書發表於2016-01-10
學習地址:

%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html

新增依賴:

  1.         <dependency>
  2.             <groupId>org.apache.lucene</groupId>
  3.             <artifactId>lucene-core</artifactId>
  4.             <version>4.3.1</version>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>org.apache.lucene</groupId>
  8.             <artifactId>lucene-queryparser</artifactId>
  9.             <version>4.3.1</version>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>org.apache.lucene</groupId>
  13.             <artifactId>lucene-queries</artifactId>
  14.             <version>4.3.1</version>
  15.         </dependency>
  16.         <dependency>
  17.             <groupId>org.apache.lucene</groupId>
  18.             <artifactId>lucene-highlighter</artifactId>
  19.             <version>4.3.1</version>
  20.         </dependency>
  21.         <dependency>
  22.             <groupId>org.apache.lucene</groupId>
  23.             <artifactId>lucene-analyzers-smartcn</artifactId>
  24.             <version>4.3.1</version>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.apache.lucene</groupId>
  28.             <artifactId>lucene-analyzers-common</artifactId>
  29.             <version>4.3.1</version>
  30.         </dependency>
索引基本使用
1.建立索引和搜尋
  1. import java.io.File;  
  2. import java.io.IOException;  
  3.   
  4. import org.apache.lucene.analysis.Analyzer;  
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  6. import org.apache.lucene.document.Document;  
  7. import org.apache.lucene.document.Field.Store;  
  8. import org.apache.lucene.document.IntField;  
  9. import org.apache.lucene.document.StringField;  
  10. import org.apache.lucene.document.TextField;  
  11. import org.apache.lucene.index.DirectoryReader;  
  12. import org.apache.lucene.index.IndexWriter;  
  13. import org.apache.lucene.index.IndexWriterConfig;  
  14. import org.apache.lucene.index.IndexWriterConfig.OpenMode;  
  15. import org.apache.lucene.queryparser.classic.ParseException;  
  16. import org.apache.lucene.queryparser.classic.QueryParser;  
  17. import org.apache.lucene.search.IndexSearcher;  
  18. import org.apache.lucene.search.Query;  
  19. import org.apache.lucene.search.TopDocs;  
  20. import org.apache.lucene.store.Directory;  
  21. import org.apache.lucene.store.FSDirectory;  
  22. import org.apache.lucene.util.Version;  
  23.   
  24. public class Index {  
  25.     public static void main(String[] args) {  
  26.         Index index = new Index();  
  27.         index.createIndex();  
  28.         index.search();  
  29.     }  
  30.   
  31.     public void createIndex() {  
  32.   
  33.         // 建立一個分詞器(指定Lucene版本)  
  34.         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);  
  35.         // IndexWriter配置資訊(指定Lucene版本和分詞器)  
  36.         IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);  
  37.         // 設定索引的開啟方式  
  38.         indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);  
  39.         // 建立Directory物件和IndexWriter物件  
  40.         Directory directory = null;  
  41.         IndexWriter indexWriter = null;  
  42.         try {  
  43.             directory = FSDirectory.open(new File("Lucene_index/test"));  
  44.   
  45.             // 檢查Directory物件是否處於鎖定狀態(如果鎖定則進行解鎖)  
  46.             if (IndexWriter.isLocked(directory)) {  
  47.                 IndexWriter.unlock(directory);  
  48.             }  
  49.   
  50.             indexWriter = new IndexWriter(directory, indexWriterConfig);  
  51.         } catch (IOException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.   
  55.         // 建立測試文件併為其新增域  
  56.         Document doc1 = new Document();  
  57.         doc1.add(new StringField("id""abcde", Store.YES)); // 新增一個id域,域值為abcde  
  58.         doc1.add(new TextField("content""使用Lucene實現全文檢索", Store.YES)); // 文字域  
  59.         doc1.add(new IntField("num"1, Store.YES)); // 新增數值域  
  60.   
  61.         // 將文件寫入索引  
  62.         try {  
  63.             indexWriter.addDocument(doc1);  
  64.         } catch (IOException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.   
  68.         Document doc2 = new Document();  
  69.         doc2.add(new StringField("id""yes", Store.YES));  
  70.         doc2.add(new TextField("content""Docker容器技術簡介", Store.YES));  
  71.         doc2.add(new IntField("num"2, Store.YES));  
  72.         try {  
  73.             indexWriter.addDocument(doc2);  
  74.         } catch (IOException e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.   
  78.         // 將IndexWriter提交  
  79.         try {  
  80.             indexWriter.commit();  
  81.         } catch (IOException e) {  
  82.             e.printStackTrace();  
  83.         } finally {  
  84.             try {  
  85.                 indexWriter.close();  
  86.                 directory.close();  
  87.             } catch (IOException e) {  
  88.                 e.printStackTrace();  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     public void search() {  
  94.         Directory directory = null;  
  95.         DirectoryReader dReader = null;  
  96.         try {  
  97.             directory = FSDirectory.open(new File("Lucene_index/test")); // 索引檔案  
  98.             dReader = DirectoryReader.open(directory); // 讀取索引檔案  
  99.             IndexSearcher searcher = new IndexSearcher(dReader); // 建立IndexSearcher物件  
  100.   
  101.             Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); // 指定分詞技術(標準分詞-與建立索引時使用的分詞技術一致)  
  102.   
  103.             // 建立查詢字串(指定搜尋域和採用的分詞技術)  
  104.             QueryParser parser = new QueryParser(Version.LUCENE_43, "content", analyzer);  
  105.             Query query = parser.parse("Docker"); // 建立Query物件(指定搜尋詞)  
  106.   
  107.             // 檢索索引(指定前10條)  
  108.             TopDocs topDocs = searcher.search(query, 10);  
  109.             if (topDocs != null) {  
  110.                 System.out.println("符合條件的文件總數為:" + topDocs.totalHits);  
  111.                 for (int i = 0; i < topDocs.scoreDocs.length; i++) {  
  112.                     Document doc = searcher.doc(topDocs.scoreDocs[i].doc);  
  113.                     System.out.println(  
  114.                             "id = " + doc.get("id") + ",content = " + doc.get("content") + ",num = " + doc.get("num"));  
  115.                 }  
  116.             }  
  117.         } catch (IOException e) {  
  118.             e.printStackTrace();  
  119.         } catch (ParseException e) {  
  120.             e.printStackTrace();  
  121.         } finally {  
  122.             try {  
  123.                 dReader.close();  
  124.                 directory.close();  
  125.             } catch (IOException e) {  
  126.                 e.printStackTrace();  
  127.             }  
  128.         }  
  129.     }  
  130. }  

2.分詞器對比
  1. import java.io.IOException;  
  2. import java.io.StringReader;  
  3.   
  4. import org.apache.lucene.analysis.Analyzer;  
  5. import org.apache.lucene.analysis.TokenStream;  
  6. import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
  7. import org.apache.lucene.analysis.core.KeywordAnalyzer;  
  8. import org.apache.lucene.analysis.core.SimpleAnalyzer;  
  9. import org.apache.lucene.analysis.core.StopAnalyzer;  
  10. import org.apache.lucene.analysis.core.WhitespaceAnalyzer;  
  11. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  12. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  13. import org.apache.lucene.util.Version;  
  14. import org.wltea.analyzer.lucene.IKAnalyzer;  
  15.   
  16. public class AnalyzerTest {  
  17.     public static void main(String[] args) {  
  18.         AnalyzerTest test=new AnalyzerTest();  
  19.         test.testAnalyzer();  
  20.     }  
  21.   
  22.     public void testAnalyzer() {  
  23.   
  24.         final String str = "今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。";  
  25.         Analyzer analyzer = null;  
  26.   
  27.         analyzer = new StandardAnalyzer(Version.LUCENE_43); // 標準分詞  
  28.         print(analyzer, str);  
  29.         analyzer = new IKAnalyzer(); // 第三方中文分詞  
  30.         print(analyzer, str);  
  31.         analyzer = new WhitespaceAnalyzer(Version.LUCENE_43); // 空格分詞  
  32.         print(analyzer, str);  
  33.         analyzer = new SimpleAnalyzer(Version.LUCENE_43); // 簡單分詞  
  34.         print(analyzer, str);  
  35.         analyzer = new CJKAnalyzer(Version.LUCENE_43); // 二分法分詞  
  36.         print(analyzer, str);  
  37.         analyzer = new KeywordAnalyzer(); // 關鍵字分詞  
  38.         print(analyzer, str);  
  39.         analyzer = new StopAnalyzer(Version.LUCENE_43); // 被忽略詞分詞器  
  40.         print(analyzer, str);  
  41.   
  42.     }  
  43.   
  44.     /** 
  45.      * 該方法用於列印分詞器及其分詞結果 
  46.      *  
  47.      * @param analyzer 
  48.      *            分詞器 
  49.      * @param str 
  50.      *            需要分詞的字串 
  51.      */  
  52.     public void print(Analyzer analyzer, String str) {  
  53.   
  54.         StringReader stringReader = new StringReader(str);  
  55.         try {  
  56.             TokenStream tokenStream = analyzer.tokenStream("", stringReader); // 分詞  
  57.             tokenStream.reset();  
  58.   
  59.             CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class); // 獲取分詞結果的CharTermAttribute  
  60.             System.out.println("分詞技術:" + analyzer.getClass());  
  61.             while (tokenStream.incrementToken()) {  
  62.                 System.out.print(term.toString() + "|");  
  63.             }  
  64.             System.out.println();  
  65.         } catch (IOException e) {  
  66.             e.printStackTrace();  
  67.         }  
  68.     }  
  69. }  

結果:
分詞技術:class org.apache.lucene.analysis.standard.StandardAnalyzer
今|天|的|生|活|是|因|為|你|三|年|前|的|選|擇|而|今|天|的|選|擇|將|決|定|你|三|年|後|的|生|活|
分詞技術:class org.wltea.analyzer.lucene.IKAnalyzer
今天|的|生活|是因為|因為|你|三年|三|年前|年|前|的|選擇|而今|今天|的|選擇|將|決定|你|三年|三|年後|年|後|的|生活|
分詞技術:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.SimpleAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|
分詞技術:class org.apache.lucene.analysis.cjk.CJKAnalyzer
今天|天的|的生|生活|活是|是因|因為|為你|你三|三年|年前|前的|的選|選擇|而今|今天|天的|的選|選擇|將決|決定|定你|你三|三年|年後|後的|的生|生活|
分詞技術:class org.apache.lucene.analysis.core.KeywordAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.StopAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1974653/,如需轉載,請註明出處,否則將追究法律責任。

相關文章