转载

初探Lucene

学习地址:
https://segmentfault.com/a/1190000003101607
http://yijun1171.github.io/2014/12/06/Lucene%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
今天的生活是因为你三年前的选择|而今天的选择|将决定你三年后的生活|


正文到此结束
Loading...