lucene 分词器的原理和学习

  全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)

整个分析过程,如下图所示:

 

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package  org.lucene.test;
 
import  org.apache.lucene.analysis.Analyzer;
import  org.apache.lucene.analysis.core.SimpleAnalyzer;
import  org.apache.lucene.analysis.core.StopAnalyzer;
import  org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import  org.apache.lucene.analysis.standard.StandardAnalyzer;
import  org.junit.Test;
import  org.lucene.Util.AnalyzerUtils;
 
public  class  TestAnalyzer {
 
    @Test
     public  void  test01()  throws  Exception {
         Analyzer a1 =  new  StandardAnalyzer(); //标准分词器
         Analyzer a2 =  new  StopAnalyzer(); //停用分词器
         Analyzer a3 =  new  SimpleAnalyzer(); //简单分词器
         Analyzer a4 =  new  WhitespaceAnalyzer(); //空格分词器
         String txt =  "this is my house,I an come from yunnang zhaotong ," "my qq is 6555@qq.com" ;
          AnalyzerUtils.displayToken(txt, a1);
          AnalyzerUtils.displayToken(txt, a2);
          AnalyzerUtils.displayToken(txt, a3);
          AnalyzerUtils.displayToken(txt, a4);
     }
    
    
    @Test
     public  void  test02()  throws  Exception {
         Analyzer a1 =  new  StandardAnalyzer(); //标准分词器
         Analyzer a2 =  new  StopAnalyzer(); //停用分词器
         Analyzer a3 =  new  SimpleAnalyzer(); //简单分词器
         Analyzer a4 =  new  WhitespaceAnalyzer(); //空格分词器
         String txt =  "我来自遥远的哈尔滨,大东北帝国冰城皇家科技学院--黑龙江科技大学" ;   //可以发现对中文支持无效,不支持中文
          AnalyzerUtils.displayToken(txt, a1);
          AnalyzerUtils.displayToken(txt, a2);
          AnalyzerUtils.displayToken(txt, a3);
          AnalyzerUtils.displayToken(txt, a4);
     }
}

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package  org.lucene.Util;
import  java.io.IOException;
import  java.io.StringReader;
 
import  org.apache.lucene.analysis.Analyzer;
import  org.apache.lucene.analysis.TokenStream;
import  org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 
 
public  class  AnalyzerUtils {
       public  static  void  displayToken(String str,Analyzer a)  throws  Exception{
          TokenStream stream =     a.tokenStream( "content" new  StringReader(str));
          stream.reset();   //在4.0以后的版本必须先reset一次
       //创建一个属性,这个属性被添加到流中,随着这个TOkenStream增加,这个属性也增加 
          CharTermAttribute cta = stream.addAttribute(CharTermAttribute. class );
          while  (stream.incrementToken()) {
              System.out.print( " [ " +cta+ " ] " );
         }
          System.out.println();
       
       }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值