上一章说了基本的查询流程, 这一章说一下分析器.
Lucene 默认使用的是标准分析器 StandardAnalyzer, 但是对中文是不支持分词的.
使用 Analyzer 对象的 tokenStream 方法返回一个 TokenStream 对象, 这个对象中包含了最终的分词结果. 现在来测试一把.
@Test
public void testTokenStream() throws Exception {
//创建一个 Analyzer 对象, StandardAnalyzer.
Analyzer analyzer = new StandardAnalyzer();
//使用分析器对象的 tokenStream 方法获得 TokenStream 对象.
TokenStream tokenStream = analyzer.tokenStream("", "spring lucene 全文检索是将整本书java、整篇文章中的任意内容信息查找出来的检索");
//向 TokenStream 对象中设置一个引用, 相当于设置一个指针
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
//调用 TokenStream 对象的 rest 方法, 把指针重置.
tokenStream.reset();
// 使用 while 来遍历 TokenStream 对象
// 通过 incrementToken 方法判断是否结束
while (tokenStream.incrementToken()) {
System.out.println(charTermAttribute.toString());
}
// 关闭 TokenStream
tokenStream.close();
}
运行测试方法.
![](https://img.haomeiwen.com/i7115372/27218b5acfa7ed78.png)
这里使用的就是 Lucene 默认的分析器 StandardAnalyzer , 他无法对中文做出分词效果. 比如我们想把 "全文检索"这四个字分出来 ,使用默认的就无法达到我们想要的效果.
使用第三方包 IKAnalyzer 来实现中文分词
什么是 IKAnalyzer :
IK 采用了特有的"正想迭代最细粒度切分算法", 多子处理器分析模式, 具有 50 万字/秒 的高速处理能力
网站: https://code.google.com/archive/p/ik-analyzer/downloads
在官网上下载 source 后解压 里面包含文件目录如下
![](https://img.haomeiwen.com/i7115372/c4ae199f01895709.png)
- ext.dic 扩展词典, IK 本身提供的分词词库有限, 我们可以添加自己想要的分词, 也可以去除原有的分词.
- stopword.dic 停用词典.用来停用一些不必要的敏感词.
- IKAnalyzer.cfg.xml IK的配置文件,用来指定 停用词典和扩展词典. 也可以增加自己的扩展词典.
还是上面那个例子, 我们不希望分析器对 "spring lucene 全文检索是将整本书java、整篇文章中的任意内容信息查找出来的检索" 这个字符串中的 "全文检索是将" 这几个字进行分词,
- 添加依赖
- 添加配置文件,停用词库, 扩展词库, 并在配置文件内指定词库.
- 在扩展词库内,写入我们不希望被分词的字符串 例 "全文检索是将"
- 修改上面代码中的创建分析器对象为 IKAnalyzer
- 引入依赖包
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
- 添加完依赖后, 把 ext.dic, stopword.dic, IKAnalyzer.cfg.xml copy 到项目中的 resources 目录下 , 并在 IKAnalyzer.cfg.xml 中指定扩展词库与停用词库.
![](https://img.haomeiwen.com/i7115372/ee4acb8074dc27b5.png)
IKAnalyzer.cfg.xml , 每个分号后面都可以加上自己的词库
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">hotword.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopwords.dic;</entry>
</properties>
-
把不希望分词的内容添加到 ext.dic
不希望被分词的字符串
注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8.
注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8.
注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8. -
把上面代码中创建分析器的代码改动一下
Analyzer analyzer = new StandardAnalyzer();
改为
Analyzer analyzer = new IKAnalyzer();
运行结果如下.
![](https://img.haomeiwen.com/i7115372/83f6b0d2f2231f77.png)
可以发现,我们添加进去的那个字符串,没有被分词.
停用词典的用法和扩展词典的用法一样, 也是直接添加进去就行.
最后说一遍注意编码. UTF-8.
下一章说索引库的维护.
网友评论