学习笔记(三)--Lucene分词器详解

Lucene-分词器API

org.apache.lucene.analysi.Analyzer

分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理器)。通过调用它的如下两个方法,得到输入文本的分词处理器。

public final TokenStream tokenStream(String fieldName, Reader reader)

public final TokenStream tokenStream(String fieldName, String text)

TokenStreamComponents  createComponents(String fieldName)

是Analizer中唯一的抽象方法,扩展点。通过提供该方法的实现来实现自己的Analyzer。

参数说明:fieldName,如果我们需要为不同的字段创建不同的分词处理器组件,则可根据这个参数来判断。否则,就用不到这个参数。

返回值为 TokenStreamComponents  分词处理器组件。

我们需要在createComponents方法中创建我们想要的分词处理器组件

TokenStreamComponents

分词处理器组件:这个类中封装有供外部使用的TokenStream分词处理器。提供了对source(源)和sink(供外部使用分词处理器)两个属性的访问方法

源码:

public static class TokenStreamComponents {
        protected final Tokenizer source;
        protected final TokenStream sink;
        transient ReusableStringReader reusableStringReader;

        public TokenStreamComponents(Tokenizer source, TokenStream result) {
            this.source = source;
            this.sink = result;
        }

        public TokenStreamComponents(Tokenizer source) {
            this.source = source;
            this.sink = source;
        }

        protected void setReader(Reader reader) {
            this.source.setReader(reader);
        }

        public TokenStream getTokenStream() {
            return this.sink;
        }

        public Tokenizer getTokenizer() {
            return this.source;
        }
    }

org.apache.lucene.analysis.TokenStream

分词处理器,负责对输入文本完成分词、处理。

概念说明:Token: 分项,从字符流中分出一个一个的项

概念说明:Token Attribute: 分项属性(分项的信息):如 包含的词、位置等

TokenStream 的两类子类

Tokenizer:分词器,输入是Reader字符流的TokenStream,完成从流中分出分项

TokenFilter:分项过滤器,它的输入是另一个TokenStream,完成对从上一个TokenStream中流出的token的特殊处理。

TokenStream 继承了 AttributeSource

概念说明:Attribute 属性 Token Attribute 分项属性(分项信息),如 分项的词、词的索引位置等等。这些属性通过不同的Tokenizer /TokenFilter处理统计得出。不同的Tokenizer/TokenFilter组合,就会有不同的分项信息。它是会动态变化的,你不知道有多少,是什么。那该如何实现分项信息的存储呢?

答案就是 AttributeSource、Attribute 、AttributeImpl、AttributeFactory

1、AttribureSource 负责存放Attribute对象,它提供对应的存、取方法

2、Attribute对象中则可以存储一个或多个属性信息

3、AttributeFactory 则是负责创建Attributre对象的工厂,在TokenStream中默认使用了AttributeFactory.getStaticImplementation 我们不需要提供,遵守它的规则即可。

AttributeSource使用规则说明

  • 1、某个TokenStream实现中如要存储分项属性,通过AttributeSource的两个add方法之一,往AttributeSource中加入属性对象。
  • <T extends Attribute> T addAttribute(Class<T> attClass) 该方法要求传人你需要添加的属性的接口类(继承Attribute),返回对应的实现类实例给你。从接口到实例,这就是为什么需要AttributeFactory的原因。 void addAttributeImpl(AttributeImpl att)
  • 2、加入的每一个Attribute实现类在AttributeSource中只会有一个实例,分词过程中,分项是重复使用这一实例来存放分项的属性信息。重复调用add方法添加它返回已存储的实例对象
  • 3、要获取分项的某属性信息,则需持有某属性的实例对象,通过addAttribute方法或getAttribure方法获得Attribute对象,再调用实例的方法来获取、设置值
  • 4、在TokenStream中,我们用自己实现的Attribute,默认的工厂。当我们调用这个add方法时,它怎么知道实现类是哪个?这里有一定规则要遵守:
    • 1、自定义的属性接口 MyAttribute 继承 Attribute
    • 2、自定义的属性实现类必须继承 Attribute,实现自定义的接口MyAttribute
    • 3、自定义的属性实现类必须提供无参构造方法
    • 4、为了让默认工厂能根据自定义接口找到实现类,实现类名需为 接口名+Impl 。 请查看lucene中提供的Attribute实现是否是这样的。

TokenStream 的使用步骤

我们在应用中并不直接使用分词器,只需为索引引擎和搜索引擎创建我们想要的分词器对象。但我们在选择分词器时,会需要测试分词器的效果,就需要知道如何使用得到的分词处理器TokenStream,使用步骤:

1、从tokenStream获得你想要获得分项属性对象(信息是存放在属性对象中的)

2、调用 tokenStream 的 reset() 方法,进行重置。因为tokenStream是重复利用的。

3、循环调用tokenStream的incrementToken(),一个一个分词,直到它返回false

4、在循环中取出每个分项你想要的属性值。

5、调用tokenStream的end(),执行任务需要的结束处理。

6、调用tokenStream的close()方法,释放占有的资源

猜你喜欢

转载自www.cnblogs.com/hollowcabbage/p/9064246.html
今日推荐