ITPub博客

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

Lucene源码解析--Analyzer之TokenFilter

原创 Linux操作系统 作者:百联达 时间:2013-07-09 15:32:21 0 删除 编辑

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

TokenFilter的类结构图:


TokenFilter各类介绍:

1.TokenFilter
输入参数为另一个TokerStream的TokerStream,其子类必须覆盖incrementToken()函数。


2.LowerCaseFilter
将Token分词转换为小写。

3.FilteringTokenFilter

TokenFilters的一个抽象类,可能会删除分词。如果当前分词要保存,则需要实现accept()方法
并返回一个boolean值。incrementToken()方法将调用accept()方法来决定是否将当前的分词返回
给调用者。

4.StopFilter
从token stream中移除停止词(stop words).

  protected boolean accept() {
    return !stopWords.contains(termAtt.buffer(), 0, termAtt.length());//返回不是stop word的分词
  }

5.TypeTokenFilter
从token stream中移除指定类型的分词。
  protected boolean accept() {
    return useWhiteList == stopTypes.contains(typeAttribute.type());
  }

StopAnalyzer测试实例:

public class StopAnalyzerTest {
    public static void main(String[] args) {
       
        String content="No news is good news!";
       
        try {
            StopAnalyzer analyzer=new StopAnalyzer(Version.LUCENE_43);
            TokenStream tokenStream=analyzer.tokenStream("", new StringReader(content));
            tokenStream.reset();
            while (tokenStream.incrementToken()) {
                CharTermAttribute attribute=tokenStream.getAttribute(CharTermAttribute.class);
                System.out.println(attribute.toString());
               
            }
           
        } catch (Exception e) {
            e.printStackTrace();
        }
       
    }
}

输出结果:

news
good
news

tf.jpg

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

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

注册时间:2013-02-05

  • 博文量
    317
  • 访问量
    1017913