说明:es默认的分词器对中文的识别不是特别好,一段话的分词是一个一个汉字,这显然没有达到想要的结果。
可以安装IK分词器,兼容中文的分词;
IK分词器
安装
安装IK分词器,例如elasticsearch的容器名为es;
(命令方式,安装速度慢,网络状况不好非常容易失败,而且会丢失文件,不推荐使用)
# 进入容器内部
docker exec -it es /bin/bash# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip#退出
exit#重启容器
docker restart es
(手动拖入)
可以选择在对应网站下载(注意ik版本需要和es版本一致),然后将文件拖入到es容器挂载的数据卷目录下;
# 查看es容器挂载的数据卷路径
docker volume inspect es-plugins
将下载下来的IK分词器文件,解压,复制到此目录下;
使用
IK分词器有以下两种模式:
-
ik_smart:最少切分,最少分词数量;
-
ik_max_word:最细切分,最多可分词数;
使用“ik_smart”模式,可以看右侧,分词是符合中文语境的;
“ik_max_word”模式
扩展词汇&敏感词汇排除
有一些人名、名牌、热词等词汇,在分词时可能会被拆分开,如“王麻子菜刀”,可能被拆分成了“王麻子”、“菜刀”,拆分之后就没有意义了。这些词汇可以添加到IK分词器的扩展字典文件中,使分词时这些词汇被作为一个完整的词划分。
另外,也有一些词汇是敏感词汇(政治、宗教、辱骂等等),我们希望在搜索时,这些分词不参与分词和搜索。同样这类词汇也可以添加到IK分词器的停用词典中,使这类敏感词汇不参与分词和搜索。
第一步:修改配置文件
在IK分词器目录下,切换到config目录,打开文件IKAnalyzer.cfg.xml,设置扩展词汇和排除词汇文件名;
IKAnalyzer.cfg.xml文件内容
第二步:添加词汇
分别在扩展词汇词典、停用词典添加对应的词汇
(扩展词汇文件,ext.dic,该文件不存在,需手动创建)
(停用词典文件,stopword.dic,新增一个词汇月亮)
第三步:重启es
重启es,测试,可以看到分词把“毛源昌眼镜”当做一个词来划分了,达到了想要的结果;
同样,月亮被作停用词典中的词汇,未参与分词;
注意
需要注意的是,如果一个词汇是一个较为特别的词汇,如“独钓寒江雪”;
在分词排除时不会排除掉,因为在分词时,这句词汇不太可能被分为一个完整的词汇,而在停用词典中,是根据完整的词汇来排除的;
所以,做到万无一失,应该把需要排除分词的词汇,先在扩展词典里添加,然后再在停用词典里添加,这样就绝对会被排除掉了;
重启es,测试,“独钓寒江雪”被完全排除
总结
es分词对中文兼容不太好,可以选择IK分词器来使用,IK分词器有两种模式,分别是“ik_smart”、“ik_max_word”。
另外,IK分词器支持对词汇进行扩展,可以把一些需要绑定在一起的词汇,不希望被分开的词汇写入到扩展词典中,这些词汇会被当做一个整体参与分词;同样如果需要排除一些词汇,不希望这些词汇参与分词,也可以将这些词汇写入到停用词典中。