安装IK分词器

491 阅读3分钟

下载

# 下载地址
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.3.0

安装方式一

在elasticsearch的bin目录下执行一下命令,es插件管理器会自动帮我们安装,然后等待安装完成:

./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip

下载完成后会提示Continue with installation?输入y即可完成安装最后重启elasticsearch和kibana

安装方式二

在elasticsearch安装目录的plugins目录下新建 analysis-ik 目录

#新建analysis-ik文件夹
mkdir analysis-ik

#切换至analysis-ik文件夹下
cd analysis-ik

#上传资料中的 elasticsearch-analysis-ik-7.3.0.zip到服务器
#解压
unzip elasticsearch-analysis-ik-7.3.0.zip

#解压完成后删除zip
rm -rf elasticsearch-analysis-ik-7.3.0.zip

最后重启elasticsearch和kibana

IK分词器有两种分词模式:ik_max_wordik_smart模式

ik_max_word(常用):会将文本做最细粒度的拆分

ik_smart:会做最粗粒度的拆分

测试

ik_max_word 分词模式运行:

POST _analyze
{
    "analyzer": "ik_max_word",
     "text": "南京市长江大桥"
}

结果:

{
    "tokens": [{
        "token": "南京市",
        "start_offset": 0,
        "end_offset": 3,
        "type": "CN_WORD",
        "position": 0
    },
    {
        "token": "南京",
        "start_offset": 0,
        "end_offset": 2,
        "type": "CN_WORD",
        "position": 1
    },
    {
        "token": "市长",
        "start_offset": 2,
        "end_offset": 4,
        "type": "CN_WORD",
        "position": 2
    },
    {
        "token": "长江大桥",
        "start_offset": 3,
        "end_offset": 7,
        "type": "CN_WORD",
        "position": 3
    },
    {
        "token": "长江",
        "start_offset": 3,
        "end_offset": 5,
        "type": "CN_WORD",
        "position": 4
    },
    {
        "token": "大桥",
        "start_offset": 5,
        "end_offset": 7,
        "type": "CN_WORD",
        "position": 5
    }]
}

ik_smart分词模式运行:

POST  _analyze
{
 "analyzer": "ik_smart",
 "text": "南京市长江大桥"
}

结果:

{
    "tokens": [{
            "token": "南京市",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
    },
    {
            "token": "长江大桥",
            "start_offset": 3,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 1
    }]
}

扩展词典使用

如果现在假如江大桥是一个人名,是南京市市长,那么上面的分词显然是不合理的,该怎么办?

扩展词:就是不想让哪些词被分开,让他们分成一个词。比如上面的江大桥

自定义扩展词库

  1. 进入到config/analysis-ik/(插件命令安装方式)或plugins/analysis-ik/config(安装包安装方式)目录下,新增自定义词典
vim test_ext_dict.dic

输入:江大桥

  1. 将我们自定义的扩展词典文件添加的IKAnalyzer.cfg.xml配置中
vim 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">test_ext_dict.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
  1. 重启elasticsearch

停止词典使用

停用词: 有些词在文本中出现的频率非常高。但对本文的语义产生不了多大的影响。例如英文的a、

an、the、of等。或中文的”的、了、呢等”。这样的词称为停用词。停用词经常被过滤掉,不会被进行

索引。在检索的过程中,如果用户的查询词中含有停用词,系统会自动过滤掉。停用词可以加快索引的速度,减少索引库文件的大小。

自定义停用词库

  1. 进入到config/analysis-ik/(插件命令安装方式)或plugins/analysis-ik/config(安装包安装方式)目录下,新增自定义词典
vim test_stop_dict.dic

#输入

的

了

啊
  1. 将我们自定义的停用词典文件添加到IKAnalyzer.cfg.xml配置中
vim 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">test_ext_dict.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"> test_stop_dict.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
  1. 重启elasticsearch

同义词典使用

语言博大精深,有很多相同意思的词,我们称之为同义词,比如“番茄”和“西红柿”,“馒头”和“馍”等。在搜索的时候,我们输入的可能是“番茄”,但是应该把含有“西红柿”的数据一起查询出来,这种情况叫做同义词查询。

注意:扩展词和停用词是在索引的时候使用,而同义词是检索时候使用。

配置IK同义词

Elasticsearch 自带一个名为 synonym 的同义词 filter。为了能让 IK synonym 同时工作,我们需要定义新的 analyzer,用 IK tokenizersynonym filter。听上去很复杂,实际上要做的只是加一段配置。

  1. 创建/config/analysis-ik/synonym.txt文件,输入一些同义词并存为utf-8格式。例如
番茄,西红柿

馒头,馍