`
wbj0110
  • 浏览: 1585435 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

1〉analyzer主要包含分词器跟过滤器,他的功能就是:将分词器跟分析器进行合理的组合,使之产生对文本分词和过滤效果。因此,分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。 
2〉tokenizer主要用于对文本资源进行切分,将文本规则切分为一个个可以进入索引的最小单元 
3〉tokenfilter主要对分词器切分的最小单位进入索引进行预处理,如:大写转小写,复数转单数,也可以复杂(根据语义改写拼写错误的单词) 

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

 

Java代码   收藏代码
  1. public abstract TokenStream tokenStream(String fieldName, Reader reader);//该抽象为子分析器扩展,后面会在说到  
  2.   
  3.   public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException {  
  4.     return tokenStream(fieldName, reader);  
  5.   }//这个是后来发行版本添加的,主要用途是:创建一个TokenStream,为了同一个线程重复使用,节省时间  
  6.   
  7.   private CloseableThreadLocal tokenStreams = new CloseableThreadLocal();// 利用ThreadLocal 来达到在同一个线程重复使用。 这种应用很普遍,例如hibernate的session也是这种情况  
  8.   
  9.   protected Object getPreviousTokenStream() {  
  10.     try {  
  11.       return tokenStreams.get();  
  12.     } catch (NullPointerException npe) {  
  13.       if (tokenStreams == null) {  
  14.         throw new AlreadyClosedException("this Analyzer is closed");  
  15.       } else {  
  16.         throw npe;  
  17.       }  
  18.     }  
  19.   }  
  20.   
  21.   protected void setPreviousTokenStream(Object obj) {  
  22.     try {  
  23.       tokenStreams.set(obj);  
  24.     } catch (NullPointerException npe) {  
  25.       if (tokenStreams == null) {  
  26.         throw new AlreadyClosedException("this Analyzer is closed");  
  27.       } else {  
  28.         throw npe;  
  29.       }  
  30.     }  
  31.   }  
  32.   
  33.   public int getPositionIncrementGap(String fieldName)  
  34.   {  
  35.     return 0;  
  36.   }  
  37.   
  38.   public void close() {  
  39.     tokenStreams.close();  
  40.     tokenStreams = null;  
  41.   }  



Java代码   收藏代码
  1. public TokenStream tokenStream(String fieldName, Reader reader) {  
  2.     StandardTokenizer tokenStream = new StandardTokenizer(reader, replaceInvalidAcronym);  
  3.     tokenStream.setMaxTokenLength(maxTokenLength);  
  4.     TokenStream result = new StandardFilter(tokenStream);  
  5.     result = new LowerCaseFilter(result);  
  6.     result = new StopFilter(result, stopSet);  
  7.     return result;  
  8.   }  


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

Java代码   收藏代码
  1. public StandardTokenizer(Reader input, boolean replaceInvalidAcronym) {  
  2.     this.replaceInvalidAcronym = replaceInvalidAcronym;  
  3.     this.input = input;  
  4.     this.scanner = new StandardTokenizerImpl(input);  
  5.   }  



StandardTokenizerImpl的构造方法: 

Java代码   收藏代码
  1. StandardTokenizerImpl(java.io.Reader in) {  
  2.     this.zzReader = in;  
  3.   }  



StartdFilter的构造方法: 

Java代码   收藏代码
  1. public StandardFilter(TokenStream in) {  
  2.     super(in);  
  3.   }  



当建立索引或者搜索的时候,会调用由tokenStream方法返回的TokenStream的next()方法,也是这个时候真正的分词和过滤就开始了。 
接着看,当第一调用next()方法时候,首先应该进入StopFilter的next,因为result = new StopFilter(result, stopSet); 

Java代码   收藏代码
  1. public final Token next(final Token reusableToken) throws IOException {  
  2.     assert reusableToken != null;  
  3.     // return the first non-stop word found  
  4.     int skippedPositions = 0;  
  5.     for (Token nextToken = input.next(reusableToken); nextToken != null; nextToken = input.next(reusableToken)) {  
  6.       if (!stopWords.contains(nextToken.termBuffer(), 0, nextToken.termLength())) {  
  7.         if (enablePositionIncrements) {  
  8.           nextToken.setPositionIncrement(nextToken.getPositionIncrement() + skippedPositions);  
  9.         }  
  10.         return nextToken;  
  11.       }  
  12.       skippedPositions += nextToken.getPositionIncrement();  
  13.     }  
  14.     // reached EOS -- return null  
  15.     return null;  
  16.   }  


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

Java代码   收藏代码
  1. StandardTokenizer tokenStream = new StandardTokenizer(reader, replaceInvalidAcronym);  
  2.     tokenStream.setMaxTokenLength(maxTokenLength);  
  3.     TokenStream result = new StandardFilter(tokenStream);  
  4.     result = new LowerCaseFilter(result);  
  5.     result = new StopFilter(result, stopSet);  


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

分享到:
评论

相关推荐

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

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

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

Global site tag (gtag.js) - Google Analytics