image.png

1 ES 中的分词的原理

1.1 ES 的分词器概念

ES 的一个分词器 ( tokenizer ) 接收一个字符流,将其分割为独立的词元 ( tokens ) ,然后输出词元流。
ES 提供了很多内置的分词器,可以用来构建自定义分词器 ( custom ananlyzers )

1.2 标准分词器原理

比如 stadard tokenizer 标准分词器,遇到空格进行分词。该分词器还负责记录各个词条 ( term ) 的顺序或 position 位置 ( 用于 phrase 短语和 word proximity 词近邻查询 ) 。每个单词的字符偏移量 ( 用于高亮显示搜索的内容 ) 。

1.3 英文和标点符号分词示例

查询示例如下:

  1. POST _analyze
  2. {
  3. "analyzer": "standard",
  4. "text": "Do you know why I want to study ELK? 2 3 33..."
  5. }

查询结果如下:

do, you, know, why, i, want, to, study, elk, 2,3,33

从查询结果可以看到:
(1)标点符号没有分词。
(2)数字会进行分词。

1.4 中文分词示例

但是这种分词器对中文的分词支持不友好,会将词语分词为单独的汉字。比如下面的示例会将 悟空聊架构 分词为 ,,,,,期望分词为 悟空架构

POST _analyze
{
  "analyzer": "standard",
  "text": "悟空聊架构"
}

我们可以安装 ik 分词器来更加友好的支持中文分词。

2 安装 ik 分词器

2.1 ik 分词器地址

地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

先检查 ES 版本,我安装的版本是 7.4.2,所以我们安装 ik 分词器的版本也选择 7.4.2

2.2 安装 ik 分词器的方式

2.2.1 方式一:容器内安装 ik 分词器

  • 进入 es 容器内部 plugins 目录

    docker exec -it <容器 id> /bin/bash
    
  • 获取 ik 分词器压缩包

    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
    
  • 解压缩 ik 压缩包

    unzip 压缩包
    
  • 删除下载的压缩包

    rm -rf *.zip
    

    但是这种方式重启容器就还需要再次进行配置

2.2.2 方式二:映射文件安装 ik 分词器(推荐)

进入到映射文件夹

cd /mydata/elasticsearch/plugins

下载安装包

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
  • 解压缩 ik 压缩包

    unzip 压缩包
    
  • 删除下载的压缩包

    rm -rf *.zip
    

3 检查 ik 分词器安装

  • 进入到容器中

    docker exec -it <容器 id> /bin/bash
    
  • 查看 Elasticsearch 的插件

    elasticsearch-plugin list
    

    结果如下,说明 ik 分词器安装好了。是不是很简单。

    ik
    

4 使用 ik 中文分词器

ik 分词器有两种模式

  • 智能分词模式 ( ik_smart )
  • 最大组合分词模式 ( ik_max_word )
POST _analyze
{
  "analyzer": "ik_smart",
  "text": "一颗小星星"
}

智能分词 模式的效果。比如对于 一颗小星星 进行中文分词,得到的两个词语:一颗小星星
最大组合分词模式: 一颗小星星 被分成了 6 个词语:一颗、一、颗、小星星、小星、星星。

6 自定义分词词库

6.1 自定义词库的方案

  • 方案
    新建一个词库文件,然后在 ik 分词器的配置文件中指定分词词库文件的路径。可以指定本地路径,也可以指定远程服务器文件路径。这里我们使用远程服务器文件的方案,因为这种方案可以支持热更新 ( 更新服务器文件,ik 分词词库也会重新加载 ) 。
  • 修改配置文件

ik 分词器的配置文件在容器中的路径:

/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml。

修改这个文件可以通过修改映射文件,文件路径:

/mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

编辑配置文件:

vim /mydata/elasticsearch/plugins/ik/config/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">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
     <!--用户可以在这里配置远程扩展字典 -->
    <entry key="remote_ext_dict">location</entry>
     <!--用户可以在这里配置远程扩展停止词字典-->
    <entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>

修改配置 remote_ext_dict 的属性值,指定一个 远程网站文件的路径,比如 http://www.abc.abc/ikwords.text。
这里我们可以自己搭建一套 nginx 环境,然后把 ikwords.text 放到 nginx 根目录。

6.2 搭建 nginx 环境

方案:首先获取 nginx 镜像,然后启动一个 nginx 容器,然后将 nginx 的配置文件拷贝到根目录,再删除原 nginx 容器,再用映射文件夹的方式来重新启动 nginx 容器。

  • 启动nginx
  • 新建ik分词词库文件

    cd /mydata/nginx/html
    mkdir ik
    cd ik
    vim ik.txt
    

    访问地址:http://192.168.56.10/ik/ik.txt

  • 修改 ik 分词器配置

配置词库地址

cd /mydata/elasticsearch/plugins/ik/config
vim IKAnalyzer.cfg.xml

重启Elasticsearch即可使用了