1. 概述
一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立的单词),然后输出tokens流。例如,whitespace tokenizer遇到空白字符时分割文本,它会将文本“Quick brown fox!”分割为【Quick,brown,fox!】。
该tokenizer(分词器)还负责记录各个term(词条)的顺序或者position位置(用于phrase短语和Word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start(起始)和end(结束)的character offsets(字符偏移量)(用于高亮显示搜索的内容)。ElasticSearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)。
ES提供的分词器可以在官方文档中找到,如图:
默认的是标准分词器 。点击Standard标准分词器,里面有如图所示的例子
可以看到标准分词器是按照空格或者字符进行分词的,如果是全中文的,就会按照汉子进行分词,所以,默认的分词器往往不符合我们的实际需求。而且,ES默认提供的分词器都对英文支持良好,对中文都是不大友好的,对于中文我们需要安装单独的中文分词器,使用较多的是开源的IK分词器。
IK分词器GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik
2. 安装IK分词器
2.1 准备工作
1)明确ES版本
2)进入IK分词器的GitHub,找到ES对应的版本
2.2 安装
2.2.1 进入ES的安装目录的plugins目录
1)以交互模式进入es的控制台
docker exec -it ae76972f47b5 /bin/bash
参数解释:
-it:表示以交互模式
ae76972f47b5 :es的容器id
/bin/bash:表示控制台
如图:
2)进入plugins目录
cd plugins/
2.2.2 下载IK分词器
1)复制ik分词器的下载地址
2)将ik下载到plugins目录
使用wget下载命令
发现wget不存在,这是因为虚拟机安装的是纯净版,没有wget,解决方案
2.1. 安装wget
2.2 进入物理映射目录
因为es是docker安装的,且配置了目录映射地址,因此,可以不用进入容器,直接在对应的映射地址进行操作即可
操作步骤:
1)退出容器(exit)
2)进入映射目录
cd /mydata/elasticsearch/plugins/
3)安装wget
yum install wget
如图:
4)使用wget下载ik
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
查看
注意:
1)我们也可以使用一些客户端将文件上传到Linux主机上,比如XShell工具
2)使用XShell需要设置虚拟机允许用户名密码登录(因为用vagrant安装的,默认用户名密码登录没开启)
Vagrant进入系统之后
su
vi /etc/ssh/sshd_conf
修改 PasswordAuthentication yes
重启服务:service sshd restart
如图:
3)连接XShell
2.2.3 解压文件
unzip elasticsearch-analysis-ik-7.4.2.zip
注意:
1)如果unzip没安装,使用 yum install unzip安装即可
2)删除源文件 elasticsearch-analysis-ik-7.4.2.zip
3)新建ik目录,将解压的文件都移动到ik目录下(可以不做,为了好看)
2.2.4 检查安装是否成功
1)进入es容器内部
docker ps
docker exec -it ae76972f47b5 /bin/bash
cd bin
2)运行插件命令
elasticsearch-plugin -h
按回车,可以看到一个list参数
elasticsearch-plugin list
可以看到一个ik,说明我们把ik分词器安装好了。
2.2.4 重启ElasticSearch
1)退出容器:exit
2)重启:docker restart elasticsearch
3. 测试
3.1 没用ik分词器之前
POST _analyze
{
"analyzer": "standard",
"text":"我爱我家"
}
3.2 使用ik分词器
POST _analyze
{
"analyzer": "ik_smart",
"text":"我爱我家"
}
4. ik常用的两种分词器
4.1 ik_smart(智能分词)
4.2 ik_max_word