所谓分析,用更具体的话说其实就是"分词"和"过滤"; 1〉analyzer主要包含分词器跟过滤器,他的功能就是:将分词器跟分析器进行合理的组合,使之产生对文本分词和过滤效果。因此,分析器使用分词和过滤器构成一个管道,文本在“滤过”这个管道之后,就成为可以进入索引的最小单位。
3〉tokenfilter主要对分词器切分的最小单位进入索引进行预处理,如:大写转小写,复数转单数,也可以复杂(根据语义改写拼写错误的单词)
Token: 如果一个字段被token化,这表示它经过了一个可将内容转化为tokens串的分析程序。 Token是建立索引的基本单位,表示每个被编入索引的字符。 在token化的过程中,分析程序会在使用任何转换逻辑(例如去掉 "a” 或 "the" 这类停用词,执行词干搜寻,将无大小写区分的所有文字转换成小写等)的同时,抽取应被编入索引的文本内容。由于和字段相关的内容减少到只剩核心元素,因此,索引作为与某个字段相关的文字内容,它的规模也被缩小了。只有被token化的字段也将被编入索引的情况下才有意义。 对Akamai.com来说,“标题”被token化,所以Lucene不用搜寻如 "a" 或 "the" 这类单词。
TokenStream是用来走访Token的iterator(迭代器)
public abstract class TokenStream {public abstract Token next() throws IOException;public void close() throws IOException {}}
Tokenizer继承自TokenStream,其输入为Reader
public abstract class Tokenizer extends TokenStream {
protected Reader input;
protected Tokenizer() {}
protected Tokenizer(Reader input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如
去StopWords,将Token变为小写等。
public abstract class TokenFilter extends TokenStream {
protected TokenStream input;
protected TokenFilter() {}
protected TokenFilter(TokenStream input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
Analyzer就是一个TokenStream工厂
public abstract class Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader){
return tokenStream(reader);
}
public TokenStream tokenStream(Reader reader){
return tokenStream(null, reader);
}
}
Analyzer的作用就是把文本分解为便于Lucene处理的token,好比人体的肠道,负责把食物分解成易于吸收的小块。
它主要用于分析切词或者过滤搜索时遇到的各种文本。用更具体的话说其实就是"分词"和"过滤"。
** 作用:分析器作用与索引和文本之间,索引要进入索引库的文本资源都要先通过分析器的分析(切词和过滤),
以便确保索引库中的索引内容的正确性。
如果不经过分析器分析就把文本内容存入索引中,那么会引起索引内容数据的不一致,也会降低索引的效率,
进而影响整个搜索引擎的性能。
** 注意:一个分析器主要包括分词器和过滤器两种组件。
1.1.1 分词器:就是用于对文本资源进行切词,
将文本按照规则切分为一个个可以进入索引的最小单位--分词。(具体下边标题会讲到)
1.1.2 过滤器:对分词器切成的索引最小单位,即对分词进行预处理操作。
比如大写转小写、复数转单数、根据语义改写拼写错误的单词等。(具体下边标题会讲到)
** 说明:此处我们着重讲解Analyzer分析器的实现。所有的分析器都是继承的org.apache.lucene.analysis.Analyzer抽象类,
该类中只定义了两个方法《自己可查看源代码》
1.2 分词器(Tokenizer)和过滤器(TokenFilter):前边说过分析器的功能就是进行分词和过滤。
所以在Analyzer分析器的对象中一定会保存对分词器对像和过滤器对象的引用,然后调用分词器对象和过滤器对象的API接口,
以便完成切词和过滤的功能目的。