IKAnalyzer下载地址
链接:https://pan.baidu.com/s/1bNqXh8B7suT1rAUm_ZZ7gw 提取码:c08j
文件夹结构如下
在Lucene中默认的分析器StandardAnalyzer对于汉字进行分析的时候是拆成一个字,一个字的,每个字算上一个词
//用于配置分词器 IndexWriterConfig config = new IndexWriterConfig();
在IndexWriterConfig的构造方法中使用的是StandardAnalyzer
public IndexWriterConfig() { this(new StandardAnalyzer()); }
我们要使用中文的分词器的话就要把他替换掉,
先来测试一下使用默认的StandardAnalyzer分词效果
import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.IOException; public class MyTokenStream { public static void main(String[] args) throws IOException { //创建一个标准分析器对象 Analyzer analyzer=new StandardAnalyzer(); //获取tokenStream对象 //参数1域名 2要分析的文本内容 TokenStream tokenStream=analyzer.tokenStream("","test a lucene 程序,杯莫停"); //添加引用,用于获取每个关键词 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //添加一个偏移量的引用,记录了关键词的开始位置以及结束位置 OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); //将指针调整到列表的头部 tokenStream.reset(); //遍历关键词列表,incrementToken判断是否结束 while (tokenStream.incrementToken()) { System.out.println("开始--->"+offsetAttribute.startOffset()); System.out.println(charTermAttribute); System.out.println("结束--->"+offsetAttribute.endOffset()); } tokenStream.close(); } }
测试结果如下
"程序"一词被分成了两个单独的字
接下来使用第三方的IKAnalyzer,导入maven依赖或者关联jar包
<!-- https://mvnrepository.com/artifact/com.jianggujin/IKAnalyzer-lucene --> <dependency> <groupId>com.jianggujin</groupId> <artifactId>IKAnalyzer-lucene</artifactId> <version>8.0.0</version> </dependency>
然后将下面标红线的代码进行修改
public static void main(String[] args) throws IOException { //创建一个标准分析器对象 Analyzer analyzer=new IKAnalyzer(); //获取tokenStream对象 //参数1域名 2要分析的文本内容 TokenStream tokenStream=analyzer.tokenStream("","test a lucene 程序,杯莫停"); //添加引用,用于获取每个关键词 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //添加一个偏移量的引用,记录了关键词的开始位置以及结束位置 OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); //将指针调整到列表的头部 tokenStream.reset(); //遍历关键词列表,incrementToken判断是否结束 while (tokenStream.incrementToken()) { System.out.println("开始--->"+offsetAttribute.startOffset()); System.out.println(charTermAttribute); System.out.println("结束--->"+offsetAttribute.endOffset()); } tokenStream.close(); }
可以看出来分析器把"程序"当成一个词语来看待了,但是"杯莫停",还是拆成了单个字,而且"杯"字还没有进行显示,因为"杯"字在停用词列表里
接下来在扩展词典里添加一个词语"杯莫停"
测试结果
TIP:在自定义扩展词典和停用词词典的过程当中,千万不要使用windows记事本编辑,因为windows记事本是UTF-8+BOM编码,文件保存的格式应当是UTF-8