ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Lucene源码解析--Analyzer类

Lucene源码解析--Analyzer类

原创 Linux操作系统 作者:百联达 时间:2013-07-08 15:55:24 0 删除 编辑

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

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



1.Analyzer类:

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

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

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


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

ae9bc497-4872-31d4-afe2-be571058e94a.jpg

ss.jpg

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

请登录后发表评论 登录
全部评论
10年以上互联网经验,先后从事过制造业,证券业,物业行业和物流行业信息系统和互联网产品的研发,6年系统架构经验。最近关注Kubernetes微服务架构和Istio微服务治理框架。

注册时间:2013-02-05

  • 博文量
    317
  • 访问量
    1010300