ES 终于可以搜到”悟空哥“了!

Elasticsearch 搜索引擎内置了很多种分词器,但是对中文分词不友好,所以我们需要借助第三方中文分词工具包。

悟空哥专门研究了下 ik 中文分词工具包该怎么玩,希望对大家有所帮助。

本文主要内容如下:

主要内容

1 ES 中的分词的原理 1.1 ES 的分词器概念

ES 的一个分词器 ( tokenizer ) 接收一个字符流,将其分割为独立的词元 ( tokens ) ,然后输出词元流。

ES 提供了很多内置的分词器,可以用来构建自定义分词器 ( custom ananlyzers )

1.2 标准分词器原理

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

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

查询示例如下:

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

查询结果:

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 分词器地址

ik 分词器地址:

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

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

:9200/ { "name" : "8448ec5f3312", "cluster_name" : "elasticsearch", "cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw", "version" : { "number" : "7.4.2", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96", "build_date" : "2019-10-28T20:40:44.881551Z", "build_snapshot" : false, "lucene_version" : "8.2.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }

选择 ik 分词器

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 2.2.3 方式三:Xftp 上传压缩包到映射目录

先用 XShell 工具连接虚拟机 ( 操作步骤可以参考之前写的文章 ) ,然后用 Xftp 将下载好的安装包复制到虚拟机。

Xftp 上传压缩包

3 解压 ik 分词器到容器中

如果没有安装 unzip 解压工具,则安装 unzip 解压工具。

apt install unzip

解压 ik 分词器到当前目录的 ik 文件夹下。

命令格式:unzip <ik 分词器压缩包>

实例:

unzip ELK-IKv7.4.2.zip -d ./ik

解压 ik 分词器

修改文件夹权限为可读可写。

chmod -R 777 ik/

删除 ik 分词器压缩包

rm ELK-IKv7.4.2.zip 4 检查 ik 分词器安装

进入到容器中

docker exec -it <容器 id> /bin/bash

查看 Elasticsearch 的插件

elasticsearch-plugin list

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

ik

然后退出 Elasticsearch 容器,并重启 Elasticsearch 容器

exit docker restart elasticsearch 5 使用 ik 中文分词器

ik 分词器有两种模式

智能分词模式 ( ik_smart )

最大组合分词模式 ( ik_max_word )

我们先看下 智能分词 模式的效果。比如对于 一颗小星星 进行中文分词,得到的两个词语:一颗、小星星

我们在 Dev Tools Console 输入如下查询

POST _analyze { "analyzer": "ik_smart", "text": "一颗小星星" }

得到如下结果,被分词为 一颗和小星星。

一颗小星星分词结果

再来看下 最大组合分词模式。输入如下查询语句。

POST _analyze { "analyzer": "ik_max_word", "text": "一颗小星星" }

一颗小星星 被分成了 6 个词语:一颗、一、颗、小星星、小星、星星。

一颗小星星分词结果

我们再来看下另外一个中文分词。比如搜索悟空哥聊架构,期望结果:悟空哥、聊、架构三个词语。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxpgp.html