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生成的分词器,他的优越性在于简单性和可扩展性。
分享到:
相关推荐
4. **集成自定义分词器**:在`Analyzer`的`tokenStream()`方法中,链式调用Tokenizer和Filter,将同义词Filter加入到分析流程中。 5. **使用自定义分词器**:在索引文档和执行查询时,使用你的自定义Analyzer实例。...
3. Tokenizer 产生的 Token 会通过一系列的 TokenFilter 进行过滤和转换,以满足不同的分析需求,例如去除停用词、词形还原等。 4. 分析器的分析效果主要通过查看 TokenStream 中的内容来判断。每个 Analyzer 都有一...
分析器包括分词器(Tokenizer)、过滤器(TokenFilter)和字符过滤器(CharFilter)。 3. **查询解析** `QueryParser`类用于将用户输入的查询字符串转化为可执行的`Query`对象。它可以处理多种查询语法,如布尔...
1. 分词器(Tokenizer):分词器是Lucene处理文本的第一步,负责将输入的字符串分解为一系列的词元(Token)。Lucene.Net包含多种预定义的分词器,如StandardAnalyzer用于英文,而ChineseAnalyzer适用于中文。 2. ...
2. 字符过滤器(CharFilter)和词过滤器(TokenFilter):这些过滤器允许我们对分词结果进行预处理,比如去除停用词、词形还原或者进行词性标注。 3. 索引(Indexing):Lucene通过构建倒排索引来实现快速搜索。...
1. 分析器(Analyzer):分析器是Lucene.NET中处理文本的核心组件,负责将原始输入文本转换为一系列的Token(分词结果)。对于中文,`Lucene.Net.Analysis.Cn.Standard.CJKStandardAnalyzer`是常用的选择,它包含...
源码中的TokenStream、Tokenizer和TokenFilter等接口和类是Analyzer的核心组成部分,理解它们之间的关系和使用方法,可以帮助我们更好地控制文本分析过程。 在实际应用中,我们可能会遇到各种复杂的文本处理需求,...
分词器(Tokenizer)将输入的文档拆分成一系列的关键词,然后通过词过滤器(TokenFilter)进行进一步的处理,如去除停用词、词形还原等。最终,这些关键词会被添加到倒排索引中,每个词都有一个包含对应文档ID的列表...
8. **分析器(Analyzer)**:分析器组合了分词器、过滤器(TokenFilter)和字符过滤器(CharFilter),负责整个文本处理过程,包括标准化、去除停用词等。 **三、Lucene 源码解读** 源码分析对于深入理解 Lucene ...
开发者可以组合使用不同的组件,如Tokenizer(分词器)、TokenFilter(过滤器)和CharFilter(字符过滤器),来创建满足特定语言或应用场景的分析流程。 二、TBRC Lucene藏文分析器 TBRC(Tibetan Buddhist ...
这个过程中涉及的关键技术包括分词器(Tokenizer)、词元过滤器(TokenFilter)和分析器(Analyzer),它们用于处理文本并生成可搜索的表示形式。 在构建基于Lucene的搜索引擎时,我们首先需要设置一个分析器来处理...
2. 断词分析器插件:根据具体语言特性,可以选用不同的分词器,如英文的StandardAnalyzer、中文的IKAnalyzer等。 3. 基于内存的搜索:对于小规模数据,Lucene.NET提供内存索引,实现快速搜索。 4. 压缩存储:索引...
5. **分词器和字符过滤器**:Lucene允许自定义分词规则,源码中可能会包含自定义Analyzer、Tokenizer和TokenFilter的示例,展示如何处理各种语言的文本。 6. **高亮显示**:为了使搜索结果更具可读性,源码会展示...
3. 文档分析器(Analyzer):结合分词器和过滤器,根据特定语言规则对文档进行分析。 4. 倒排索引(Inverted Index):Lucene的核心数据结构,将每个单词映射到包含该单词的文档列表,便于快速查找。 二、Lucene的...
6. **自定义扩展**:如果需要处理特殊词汇,可以实现`org.apache.lucene.analysis.TokenFilter`或`org.apache.lucene.analysis.Tokenizer`,并添加到分词流程中。 IKAnalyzer支持与Lucene、Solr等全文检索框架的...
- **分词器(Tokenizer)和过滤器(TokenFilter)**:用户可以自定义分词规则,例如自定义 Tokenizer 和 Filter 来处理特殊语言或特定格式的文本。 - **存储和索引**:字段可以通过设置是否存储(Store)和索引来...
4. 分词过滤器(TokenFilter):进一步处理分词器生成的词汇,例如去除停用词、词形还原等。 5. 索引(Index): Lucene将文档的字段内容转换为倒排索引,以便快速定位到包含特定词汇的文档。 三、Lucene 3.0的...
- `Analyzer`: 分析器,负责将输入文本转换为Token流,包括分词、去停用词、词形还原等。 - `Tokenizer`: 生成Token的基本单元,根据语言规则将文本切割。 - `TokenFilter`: 对Token流进行进一步处理的过滤器,例如...
3. 词项分析器(TokenFilter):分析器允许我们对分词器产生的Token进行进一步处理,例如去除停用词、词形还原等。 4. 倒排索引:Lucene的核心是倒排索引,它将每个词映射到包含该词的文档集合,并记录每个词在文档...
例如,IKAnalyzer类作为主要的入口点,配置了分词策略,并调用了Tokenizer进行初步分词,然后通过一系列TokenFilter进行进一步的词语切分和优化。 在实际应用中,我们可能会遇到一些特定需求,比如自定义停用词表、...