开发者学堂课程【Lucene 知识精讲与实战(上): 原生分词器(StandardAnalzyer)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/700/detail/12339
原生分词器(StandardAnalzyer)
Lucene 原生分词器
1.什么是原生分词器?
原生分词器是 Lucene 自带的分词器。
2. StandardAnalyzer
StandardAnalyzer 叫做标准分词器。
特点:Lucene 提供的标准分词器,可以对用英文进行天然的切分词。对英文的分词效果很好,因为英文和英文,单词和单词之间是用空格进行分隔的,单词不可能连起来写,如果不进行分隔,单词就不叫单词,它只是一堆英文字母。对中文一般用语义分析,同一句话如果切分词不同,会有不一样的意思,StandardAnalyzer 对中文是单字分词,也就是一个字就认为是一个词。
3.示例
(1)下面请看 Lucene 原生分词器的部分源代码。
protected TokenStreamComponents createComponents(String fieldName){
final StandardTokenizer src = new StandardTokenizer ();
src.setMaxTokenLength(this.maxTokenLength);
Tokenstream tok = new LowerCaseFilter (src);
Tokenstream tok = new StopFilter (tok,this.stopwords);
return new TokenStreamComponents(src,tok){
protected void setReader (Reader reader){
src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength):
super.setReader (reader);
}
}
}
选中 protected TokenStreamComponents
createComponents(String fieldName){
中的createComponents,
找到 StandardAnalyzer ,如图:
(2)然后打开 StandardAnalyze ,根据它的源代码找它的方法,如图:
传进的参数 fieldName 叫做域名,它在方法当中会把域的值取出,因为 name 名称里面包含了中英文、字母,空格等,所以可以假设存的域名是 name,然后 name 后面的值会被取出取出之后,会经过以下过程:
(3)请看以下代码:
protected TokenStreamComponents createComponents(String fieldName){
final StandardTokenizer src = new StandardTokenizer ();
src.setMaxTokenLength(this.maxTokenLength);
Tokenstream tok = new LowerCaseFilter (src);
Tokenstream tok = new StopFilter (tok,this.stopwords);
return new TokenStreamComponents(src,tok){
protected void setReader (Reader reader){
src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength):
super.setReader (reader);
}
}
}
其中,j 代码中的 LowerCaseFilter 是把大写字母转换成小写字母,StopFilter 的作用是去掉停用词,这里还有其他的一些过滤器。
回到文档中,如图是语汇单元的生成过程:
可以看到,传入域名,把域值取出,取出之后进行切分词,在切分词时,首先 StandardAnalyzer 对英文的分词是通过空格切分;对中文是一个字就是一个词的切分。切分词之后会进行大小写字母的转换,然后去掉停用词、空格以及标点符号等过滤器之后,就会返回已经切分完成的值给用户。
(4)举例:
原文档内容:
Lucene is a Java search engine。
分析后得到的多个词汇单元:
Lucene、Java、full、text、search、engine
刚开始原文档的内容是由空格分隔的,切分之后的文档内容就是:Lucene、Java、full、text、search、engine 的格式,之前的 is 和 a 在搜索中没有意义,所以它们和空格以及最后的句号一起被过滤了。这就是 StandardAnalyzer 的作用。
(5)如图:
这里使用 StandardAnalyzer 创建得到的结果。
可以看到,有4 g、6 g等词,这些就是切分后的词,而对于中文,这里显示一个字就是一个词。这就是 StandardAnalyzer 切分的效果。