全文检索之lucene的优化篇--分词器

时间:2022-09-07 03:14:04

在创建索引库的基础上,加上中文分词器的,更好的支持中文的查询。引入jarje-analysis-1.5.3.jar,极易分词.还是先看目录。

全文检索之lucene的优化篇--分词器

         建立一个分词器的包,analyzer,准备一个AnalyzerTest的类.里面的代码如下,主要写了一个testAnalyzer的方法,测试多种分词器对于中文和英文的分词;为了可以看到效果,所以写了个analyze()的方法,将分词器和text文本内容传入,并将分词的效果显示出来.

[java] view plain copy 全文检索之lucene的优化篇--分词器全文检索之lucene的优化篇--分词器
  1. package com.lucene.analyzer;  
  2.   
  3. import java.io.StringReader;  
  4.   
  5. import jeasy.analysis.MMAnalyzer;  
  6.   
  7. import org.apache.lucene.analysis.Analyzer;  
  8. import org.apache.lucene.analysis.SimpleAnalyzer;  
  9. import org.apache.lucene.analysis.Token;  
  10. import org.apache.lucene.analysis.TokenStream;  
  11. import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
  12. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  13. import org.junit.Test;  
  14.   
  15. /** 
  16.  * 对分词器的效果进行测试 
  17.  * @author liu 
  18.  * 
  19.  */  
  20. public class AnalyzerTest {  
  21.       
  22.     String enText = "IndexWriter addDocument's a javadoc.txt";  
  23.     String cnText = "我们是中国人";  
  24.       
  25.     //单字分词  
  26.     Analyzer analyzerStanderd = new StandardAnalyzer();  
  27.     //按停用词分词  
  28.     Analyzer analyzerSimple = new SimpleAnalyzer();  
  29.     //二分法分词  
  30.     Analyzer analyzerCJK = new CJKAnalyzer();   
  31.     //词库分词  
  32.     Analyzer analyzerMM = new MMAnalyzer();  
  33.       
  34.     /** 
  35.      * 测试各种分词器的分词效果 
  36.      * @throws Exception 
  37.      */  
  38.     @Test  
  39.     public void testAnalyzer() throws Exception {  
  40.         //英文分词  
  41.         analyze(analyzerStanderd,enText);  
  42.         analyze(analyzerSimple,enText);  
  43.         analyze(analyzerCJK,enText);  
  44.         analyze(analyzerMM,enText);  
  45.           
  46.         //中文分词  
  47.         analyze(analyzerStanderd,cnText);  
  48.         analyze(analyzerSimple,cnText);  
  49.         analyze(analyzerCJK,cnText);  
  50.         analyze(analyzerMM,cnText);  
  51.     }  
  52.       
  53.     /** 
  54.      * 将text文本内容进行分词,并将结果打印出来 
  55.      * @param analyzer 分词器 
  56.      * @param text     分词的文本 
  57.      * @throws Exception  
  58.      */  
  59.     public void analyze(Analyzer analyzer,String text) throws Exception {  
  60.         System.out.println("-----------分词器:"+analyzer.getClass());  
  61.         //分词器将text文本的内容分词,并打印出来  
  62.         TokenStream tokensStream = analyzer.tokenStream("content",new StringReader(text));  
  63.         for(Token token=new Token();(token=tokensStream.next(token)) !=null;) {  
  64.             System.out.println(token);  
  65.         }  
  66.     }  
  67. }  

         执行方法testAnalyzer运行效果如下.先看英文的分词的执行效果。对于标准分词器,分词的效果是将词进行了词根还原,并且全部转为小写,所以没有了adddocument's,只有adddocument.而简单分词器根据效果可以理解为根据标点符号来分割,而且只是分割.下面的CJK分词器和极易分词器主要对于中文进行分词,当然分英文也是可以的.

全文检索之lucene的优化篇--分词器

          这是中文的分词效果.standardAnalyzer是单个分词,一个一个分;simpleAnalyzer因为没有找到标点符号,分割不了;CJKAnalyzer则是二分法,将所有的都两两结合;MMAnalyzer极易分词则效果很好,根据中文的词分成了2.

全文检索之lucene的优化篇--分词器

         以上就是StandardAnalyzer,SimpleAnalyzer,CJKAnalyzer和MManalyzer的分词效果的显示.通过这段代码,可以测试更多的分词器的效果.下一篇是补充索引的功能的,之前直接了创建和查询,修改和删除没有介绍.所以,下一篇《全文检索之lucene的优化篇--增删改查》。