Lucene源码解析--Analyzer类

Analyzer,文本分析的过程,实质上是将输入文本转化为文本特征向量的过程。

Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。TokenizerAnalyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似拦截器的东东,其参数可以是TokenStreamTokenizer,甚至是另一个TokenFilter。整个Lucene Analyzer的过程如下图所示:

bb

1.Analyzer类:

Analyzer类是一个抽象类,是所有分析器的基类。为了定义分析器的具体工作

其子类必须通过自己的createComponents(String, Reader)方法来定义TokenStreamComponents

在调用方法tokenStream(String, Reader)的时候,TokenStreamComponents会被重复使用。


bb

2.TokenStreamComponents

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE该类封装了一个分词流的外部组件,简单封装输入Tokenizer和输出TokenStream


3.ReuseStrategy

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE定义Analyzer每次调用tokenStream(String, java.io.Reader)时,TokenStreamComponents的重用策略。

getReusableComponents(String fieldName)根据字段名获取可重用的TokenStreamComponents组建。

 private CloseableThreadLocal storedValue = new CloseableThreadLocal();

用于存储已有的TokenStreamComponents

4.GlobalReuseStrategy

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE公共重用策略,所有的字段共用同一个TokenStreamComponents


5.PerFieldReuseStrategy

为每一个field维持一个TokenStreamComponent Map

key=field   value=TokenStreamComponent

6.AnalyzerWrapper

使用PerFieldReuseStrategy作为重用策略的Analyzer封装类

SimpleAnalyzer测试实例:
public class SimpleAnalyzerTest {

    public static void analyze(Analyzer analyzer,String text)
    {
        try {
            System.out.println("分词器:"+analyzer.getClass());
               TokenStream  tokenStream =analyzer.tokenStream("content", new StringReader(text));
               tokenStream.reset();
              
               while(tokenStream.incrementToken())
               {
                   CharTermAttribute attribute=tokenStream.getAttribute(CharTermAttribute.class);
                   OffsetAttribute ffsetAttribute=tokenStream.getAttribute(OffsetAttribute.class);
                   System.out.println("["+offsetAttribute.startOffset()+","+offsetAttribute.endOffset()+","+attribute.toString()+"]");
               }
           
        } catch (Exception e) {
            e.printStackTrace();
        }
       
    }
   
    public static void main(String[] args)
    {
        String enText = "No news is good news!";
           String chText = "没消息,是,好消息!";
           SimpleAnalyzer analyzer1 = new SimpleAnalyzer(Version.LUCENE_43);
           analyze(analyzer1,enText);
           analyze(analyzer1,chText);
   }
}

输出结果:
分词器:class org.apache.lucene.analysis.core.SimpleAnalyzer
[0,2,no]
[3,7,news]
[8,10,is]
[11,15,good]
[16,20,news]
分词器:class org.apache.lucene.analysis.core.SimpleAnalyzer
[0,3,没消息]
[4,5,是]
[6,9,好消息] Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE

fj.pngae9bc497-4872-31d4-afe2-be571058e94a.jpg

fj.pngss.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-765793/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28624388/viewspace-765793/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值