注意:并不真正的支持汉语分词,不多说了,上代码。
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();
- }
- }
- }