注意:并不真正的支持汉语分词,不多说了,上代码。
Lucene自带的几个分词器WhitespaceAnalyzer,SimpleAnalyzer,StopAnalyzer,StandardAnalyzer,ChineseAnalyzer,CJKAnalyzer等。前面三个只适用于英文分词,StandardAnalyzer对可最简单地实现中文分词,即二分法,每个字都作为一个词,这样分出来虽然全面,但有很多缺点,比如,索引文件过大,检索时速度慢等。ChineseAnalyzer是按字分的,与StandardAnalyzer对中文的分词没有大的区别。 CJKAnalyzer是按两字切分的, 比较武断,并且会产生垃圾Token,影响索引大小。以上分词器过于简单,无法满足现实的需求,所以我们需要实现自己的分词算法。
import java.io.IOException; import java.io.Reader; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.StopAnalyzer; import org.apache.lucene.analysis.StopFilter; import org.apache.lucene.analysis.Token; import org.apache.lucene.analysis.WhitespaceAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; /** * 此次测试使用的是Lucene1.4.3 * @author 李晗 * */ public class Test { private static String STR = "i am lihan, i am a boy, i come from Beijing,我是来自北京的李晗"; // WhitespaceAnalyzer 分析方法:空格分割 public static Analyzer testWhitespaceAnalyzer(){ Analyzer alalyzer = new WhitespaceAnalyzer(); return alalyzer; } //SimpleAnalyzer 分析方法:空格及各种符号分割 public static Analyzer testSimpleAnalyzer(){ Analyzer analyzer = new SimpleAnalyzer(); return analyzer; } //StopAnalyzer 分析方法:空格及各种符号分割,去掉停止词,停止词包括 is,are,in,on,the等无实际意义的词 public static Analyzer testStopAnalyzer(){ Analyzer analyzer = new StopAnalyzer(); return analyzer; } //StandardAnalyzer 分析方法:混合分割,包括了去掉停止词,支持汉语 public static Analyzer testStandardAnalyzer(){ Analyzer analyzer = new StandardAnalyzer(); return analyzer; } public static void main(String[] a){ Analyzer analyzer = testStopAnalyzer(); Reader r = new StringReader(STR); //WhitespaceAnalyzer 和SimpleAnalyzer使用Tokenizer //Tokenizer ts = (Tokenizer) analyzer.tokenStream("", r); //StopAnalyzer和StandardAnalyzer 使用StopFilter StopFilter sf = (StopFilter) analyzer.tokenStream("", r); Token t ; try { while((t = sf.next()) != null){ System.out.println(t.termText()); } } catch (IOException e) { e.printStackTrace(); } } }