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生成的分词器,他的优越性在于简单性和可扩展性。
分享到:
相关推荐
Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器 Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器Lucene IK Analyzer 3.0 Lucene的IK Analyzer 3.0 中文分词器
lucene3.5 IKAnalyzer3.2.5 实例中文分词通过,目前在网上找的lucene 和IKAnalyzer 的最新版本测试通过。内含:示例代码,以及最新jar包。 lucene lucene3.5 IKAnalyzer IKAnalyzer3.2.5 jar 中文 分词
Lucene4.7+IK Analyzer中文分词入门教程
提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
solr的IK分词器JAR及配置文件 jar包和配置文件的放置位置不一样,详情可搜索 IK Analyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。 org.wltea.analyzer.lucene.IKAnalyzer jar
Lucene如何使用TokenFilter进行再分词,里面又我的源代码和注释!!
IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...
IKAnalyzer是一个开源的,基于Java语言开发的轻量级的中文分词语言包,它是以Lucene为应用主体,结合词典分词和文法分析算法的中文词组组件。从3.0版本开始,IK发展为面向java的公用分词组件,独立Lucene项目,同时...
lucene 所有jar包 包含IKAnalyzer分词器
IKAnalyzer中文分词器本身已经不支持最新的solr 5,集成到solr中分词会报错,这里将解决了solr 5支持问题的最新IK包共享出来,希望能帮到各位! 附上IK在schema.xml中的配置: <analyzer type="index" ...
关于lucene的IKAnalyzer分词器以及与lucene4.3共同使用时发生的问题解决包
IKAnalyzer 中文分词器V3.2使用手册 lucene
Lucene关于几种中文分词的总结
来自“猎图网 www.richmap.cn”基于IKAnalyzer分词算法的准商业化Lucene中文分词器。 1. 正向全切分算法,42万汉字字符/每秒的处理能力(IBM ThinkPad 酷睿I 1.6G 1G内存 WinXP) 2. 对数量词、地名、路名的...
导入: import net.teamhot.lucene.ThesaurusAnalyzer; import org.apache.lucene.analysis.Analyzer; 实例化: Analyzer analyzer = new ThesaurusAnalyzer();
IkAnalyzer3.2的jar包 ...Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IK Analyzer 3.X 则发展为面向Java 的公用分词组件,独立于Lucene 项目,同时提供了对 Lucene 的默认优化实现。
lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮 lucene.NET 中文分词 高亮
solr5.x(含5.4)可用的ikanalyzer中文分词 <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" /> ...