IKAnalyzer的下载和使用

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

 

posted @ 2020-02-25 13:37  天戈  阅读(6436)  评论(0编辑  收藏  举报