`

lucene 的分析器(analyzer)与分词器(tokenizer)和过滤器(tokenfilter)

阅读更多

1〉analyzer主要包含分词器跟过滤器,他的功能就是:将分词器跟分析器进行合理的组合,使之产生对文本分词和过滤效果。因此,分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。 

2〉tokenizer主要用于对文本资源进行切分,将文本规则切分为一个个可以进入索引的最小单元 

3〉tokenfilter主要对分词器切分的最小单位进入索引进行预处理,如:大写转小写,复数转单数,也可以复杂(根据语义改写拼写错误的单词) 

 

附上lucene的部分类源码以讲解:

public abstract TokenStream tokenStream(String fieldName, Reader reader);//该抽象为子分析器扩展,后面会在说到

  public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {
    return tokenStream(fieldName, reader);
  }//这个是后来发行版本添加的,主要用途是:创建一个TokenStream,为了同一个线程重复使用,节省时间

  private CloseableThreadLocal tokenStreams = new CloseableThreadLocal();// 利用ThreadLocal 来达到在同一个线程重复使用。 这种应用很普遍,例如hibernate的session也是这种情况

  protected Object getPreviousTokenStream() {
    try {
      return tokenStreams.get();
    } catch (NullPointerException npe) {
      if (tokenStreams == null) {
        throw new AlreadyClosedException("this Analyzer is closed");
      } else {
        throw npe;
      }
    }
  }

  protected void setPreviousTokenStream(Object obj) {
    try {
      tokenStreams.set(obj);
    } catch (NullPointerException npe) {
      if (tokenStreams == null) {
        throw new AlreadyClosedException("this Analyzer is closed");
      } else {
        throw npe;
      }
    }
  }

  public int getPositionIncrementGap(String fieldName)
  {
    return 0;
  }

  public void close() {
    tokenStreams.close();
    tokenStreams = null;
  }
 

 

public TokenStream tokenStream(String fieldName, Reader reader) {

 

    StandardTokenizer tokenStream = new StandardTokenizer(reader, replaceInvalidAcronym);
    tokenStream.setMaxTokenLength(maxTokenLength);
    TokenStream result = new StandardFilter(tokenStream);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result, stopSet);
    return result;
  }

 StandardAnalyzer提供的实现,可以看到很简单,就是组合了分词跟过滤器,首先实例了StandardTokenizer(),然后获得了tokenStream,将他传入过滤器,在这样的过程中,result没有发生任何改变,真正发生改变的是在建立索引或者搜索的时候,继续往下看, 

public StandardTokenizer(Reader input, boolean replaceInvalidAcronym) {
    this.replaceInvalidAcronym = replaceInvalidAcronym;
    this.input = input;
    this.scanner = new StandardTokenizerImpl(input);
  }

 StandardTokenizerImpl的构造方法:

StandardTokenizerImpl(java.io.Reader in) {
    this.zzReader = in;
  }

 StartdFilter的构造方法: 

public StandardFilter(TokenStream in) {
    super(in);
  }
 

当建立索引或者搜索的时候,会调用由tokenStream方法返回的TokenStream的next()方法,也是这个时候真正的分词和过滤就开始了。 

接着看,当第一调用next()方法时候,首先应该进入StopFilter的next,因为result = new StopFilter(result, stopSet); 

public final Token next(final Token reusableToken) throws IOException {
    assert reusableToken != null;
    // return the first non-stop word found
    int skippedPositions = 0;
    for (Token nextToken = input.next(reusableToken); nextToken != null; nextToken = input.next(reusableToken)) {
      if (!stopWords.contains(nextToken.termBuffer(), 0, nextToken.termLength())) {
        if (enablePositionIncrements) {
          nextToken.setPositionIncrement(nextToken.getPositionIncrement() + skippedPositions);
        }
        return nextToken;
      }
      skippedPositions += nextToken.getPositionIncrement();
    }
    // reached EOS -- return null
    return null;
  }

 

在这里是调用input的next(),这个input是在初始化stopFilter时进行的,其实input初始化操作也就是也就是把以参数方式传入的result给input,这个result是流经上层的过滤器过来的,回过来看看吧 

StandardTokenizer tokenStream = new StandardTokenizer(reader, replaceInvalidAcronym);
    tokenStream.setMaxTokenLength(maxTokenLength);
    TokenStream result = new StandardFilter(tokenStream);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result, stopSet);
 

是LowerCaseFilter, 其实在LowerCaseFilter中,也是按照同样的道理,这样由底层往上层追溯,然后再向下层流,这也是lucene的架构经典之处。 

 

还有在分词器这里,使用的是JAVACC生成的分词器,他的优越性在于简单性和可扩展性。

 

 

 

 

 

分享到:
评论

相关推荐

    Lucene5学习之自定义同义词分词器简单示例

    4. **集成自定义分词器**:在`Analyzer`的`tokenStream()`方法中,链式调用Tokenizer和Filter,将同义词Filter加入到分析流程中。 5. **使用自定义分词器**:在索引文档和执行查询时,使用你的自定义Analyzer实例。...

    全文检索技术学习(三)——Lucene支持中文分词 - 李阿昀的博客 - CSDN博客1

    3. Tokenizer 产生的 Token 会通过一系列的 TokenFilter 进行过滤和转换,以满足不同的分析需求,例如去除停用词、词形还原等。 4. 分析器的分析效果主要通过查看 TokenStream 中的内容来判断。每个 Analyzer 都有一...

    Lucene 常用功能介绍视频详解

    分析器包括分词器(Tokenizer)、过滤器(TokenFilter)和字符过滤器(CharFilter)。 3. **查询解析** `QueryParser`类用于将用户输入的查询字符串转化为可执行的`Query`对象。它可以处理多种查询语法,如布尔...

    Lucene.Net-2.9.2 c#源码

    1. 分词器(Tokenizer):分词器是Lucene处理文本的第一步,负责将输入的字符串分解为一系列的词元(Token)。Lucene.Net包含多种预定义的分词器,如StandardAnalyzer用于英文,而ChineseAnalyzer适用于中文。 2. ...

    lucene in action源码2

    2. 字符过滤器(CharFilter)和词过滤器(TokenFilter):这些过滤器允许我们对分词结果进行预处理,比如去除停用词、词形还原或者进行词性标注。 3. 索引(Indexing):Lucene通过构建倒排索引来实现快速搜索。...

    lucene.net.analysis.cn

    1. 分析器(Analyzer):分析器是Lucene.NET中处理文本的核心组件,负责将原始输入文本转换为一系列的Token(分词结果)。对于中文,`Lucene.Net.Analysis.Cn.Standard.CJKStandardAnalyzer`是常用的选择,它包含...

    lucene-analyzers-3.3.0 jar包和源码

    源码中的TokenStream、Tokenizer和TokenFilter等接口和类是Analyzer的核心组成部分,理解它们之间的关系和使用方法,可以帮助我们更好地控制文本分析过程。 在实际应用中,我们可能会遇到各种复杂的文本处理需求,...

    lucene

    分词器(Tokenizer)将输入的文档拆分成一系列的关键词,然后通过词过滤器(TokenFilter)进行进一步的处理,如去除停用词、词形还原等。最终,这些关键词会被添加到倒排索引中,每个词都有一个包含对应文档ID的列表...

    lucene基础学习笔记&源码

    8. **分析器(Analyzer)**:分析器组合了分词器、过滤器(TokenFilter)和字符过滤器(CharFilter),负责整个文本处理过程,包括标准化、去除停用词等。 **三、Lucene 源码解读** 源码分析对于深入理解 Lucene ...

    lucene-analyzers

    开发者可以组合使用不同的组件,如Tokenizer(分词器)、TokenFilter(过滤器)和CharFilter(字符过滤器),来创建满足特定语言或应用场景的分析流程。 二、TBRC Lucene藏文分析器 TBRC(Tibetan Buddhist ...

    人工智能-项目实践-搜索引擎-《信息检索》课程大作业3:基于Lucene的全文搜索引擎

    这个过程中涉及的关键技术包括分词器(Tokenizer)、词元过滤器(TokenFilter)和分析器(Analyzer),它们用于处理文本并生成可搜索的表示形式。 在构建基于Lucene的搜索引擎时,我们首先需要设置一个分析器来处理...

    lucene.net 2.3版

    2. 断词分析器插件:根据具体语言特性,可以选用不同的分词器,如英文的StandardAnalyzer、中文的IKAnalyzer等。 3. 基于内存的搜索:对于小规模数据,Lucene.NET提供内存索引,实现快速搜索。 4. 压缩存储:索引...

    Lucene In Action 2源码

    5. **分词器和字符过滤器**:Lucene允许自定义分词规则,源码中可能会包含自定义Analyzer、Tokenizer和TokenFilter的示例,展示如何处理各种语言的文本。 6. **高亮显示**:为了使搜索结果更具可读性,源码会展示...

    lucene-5.5.3对应的源码文件

    3. 文档分析器(Analyzer):结合分词器和过滤器,根据特定语言规则对文档进行分析。 4. 倒排索引(Inverted Index):Lucene的核心数据结构,将每个单词映射到包含该单词的文档列表,便于快速查找。 二、Lucene的...

    IKAnalyzer3[1].2.稳定版本jar包,API,使用说明

    6. **自定义扩展**:如果需要处理特殊词汇,可以实现`org.apache.lucene.analysis.TokenFilter`或`org.apache.lucene.analysis.Tokenizer`,并添加到分词流程中。 IKAnalyzer支持与Lucene、Solr等全文检索框架的...

    lucene3.5的API

    - **分词器(Tokenizer)和过滤器(TokenFilter)**:用户可以自定义分词规则,例如自定义 Tokenizer 和 Filter 来处理特殊语言或特定格式的文本。 - **存储和索引**:字段可以通过设置是否存储(Store)和索引来...

    lucene3.0

    4. 分词过滤器(TokenFilter):进一步处理分词器生成的词汇,例如去除停用词、词形还原等。 5. 索引(Index): Lucene将文档的字段内容转换为倒排索引,以便快速定位到包含特定词汇的文档。 三、Lucene 3.0的...

    Lucene 3.6 学习笔记

    - `Analyzer`: 分析器,负责将输入文本转换为Token流,包括分词、去停用词、词形还原等。 - `Tokenizer`: 生成Token的基本单元,根据语言规则将文本切割。 - `TokenFilter`: 对Token流进行进一步处理的过滤器,例如...

    用lucene实现的简易搜索引擎

    3. 词项分析器(TokenFilter):分析器允许我们对分词器产生的Token进行进一步处理,例如去除停用词、词形还原等。 4. 倒排索引:Lucene的核心是倒排索引,它将每个词映射到包含该词的文档集合,并记录每个词在文档...

    SourceCode_elasticsearch-analysis-ik-8.7.0 (1).zip

    例如,IKAnalyzer类作为主要的入口点,配置了分词策略,并调用了Tokenizer进行初步分词,然后通过一系列TokenFilter进行进一步的词语切分和优化。 在实际应用中,我们可能会遇到一些特定需求,比如自定义停用词表、...

Global site tag (gtag.js) - Google Analytics