![8ff99c14dfb5311cc6d4e96a87dd58c8.png](https://i-blog.csdnimg.cn/blog_migrate/653bcb6edf3f054d0ac5b533497b4df5.jpeg)
概述
本文都是基于elasticsearch安装教程 中的elasticsearch安装目录(/opt/environment/elasticsearch-6.4.0)为范例
环境准备
·全新最小化安装的centos 7.5
·elasticsearch 6.4.0
认识中文分词器
在博文elasticsearch分词器中提到elasticsearch能够快速的通过搜索词检索出对应的文章归功于倒排索引,下面通过中文举例看看倒排索引。
中文分词器作用以及效果
中文分词器是做什么的呢? what? 通过名字就知道了啊,为什么还要问。。。下面通过三个文档示例,看看它是如何分词的
文档1: 我爱伟大的祖国
文档2: 祝福祖国强大繁
文档3: 我爱蓝天白云
经过中文分词器,以上文档均会根据分词规则,将文档进行分词后的结果如下:
注意:不同的分词规则,分词结果不一样,选择根据分词器提供的分词规则找到适合的分词规则
文档1分词结果: [我,爱,伟大,的,祖国]
文档2分词结果: [祝福,祖国,强大,繁盛]
文档3分词结果: [我,爱,蓝天白云,蓝天,白云]
通过上面的分词结果,发现拆分的每个词都是我们熟知的词语, 但是如果不使用中文分词,就会发现上面的文档把每个字拆分成了一个词,对我们中文检索很不友好。
再看倒排索引
看到上面中文分词器结果,就会有新的疑问,使用中文分词器那样分词效果有什么好处呢? 答案就是根据分词建立词汇与文档关系的倒排索引。这步都是es帮我们做的,下面通过"我","爱","祖国"三个词看看倒排索引,如下图:
![0dceb5b96c505ef7c9b17759e9e49238.png](https://i-blog.csdnimg.cn/blog_migrate/655826614008e86b31d9b3072400e9b4.jpeg)
通过上图中的倒排索引,我们搜索"祖国"时,es通过倒排索引可以快速的检索出文档1和文档3。如果没有中文分词器,搜索"祖国"就会被拆分"祖""国"两个词的倒排索引, 就会把包含"祖"的文档都检索出来,很明显就会和我们想要的结果大相径庭。
常用的中文分词器
Smart Chinese Analysis: 官方提供的中文分词器,
IKAnalyzer: 免费开源的java分词器,目前比较流行的中文分词器之一,简单,稳定,想要特别好的效果,需要自行维护词库,支持自定义词典
结巴分词: 开源的python分词器,github有对应的java版本,有自行识别新词的功能,支持自定义词典
Ansj中文分词: 基于n-Gram+CRF+HMM的中文分词的java实现,免费开源,支持应用自然语言处理
hanlp: 免费开源,国人自然处理语言牛人无私风险的
个人对以上分词器进行了一个粗略对比,如下图:
![b47dc11b1fcfd38b98398bc2a2ad0046.png](https://i-blog.csdnimg.cn/blog_migrate/409ce683e71420f0eb41c26d6fb37a23.jpeg)
截止到目前为止,他们的分词准确性从高到低依次是:
hanlp> ansj >结巴>IK>Smart Chinese Analysis
结合准确性来看,选用中文分词器基于以下考虑:
官方的Smart Chinese Analysis直接可以不考虑了
对搜索要求不高的建议选用 IK 学习成本低,使用教程多,还支持远程词典
对新词识别要求高的选用结巴分词
Ansj和hanlp均基于自然处理语言,分词准确度高,活跃度来讲hanlp略胜一筹
博主选用的hanlp分词器,目前线上运行结果来看准确性满足需求
下面就写一下博主对IKAnalyzer 和 hanlp分词器的使用
IK Analyzer
截止目前,IK分词器插件的优势是支持自定义热更新远程词典。
安装ik分词器插件
es插件安装教程参考这里
ik的es插件地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
博主使用的es版本是6.4.0,下载时要注意对应es版本
在线安装ik es插件 命令:
# /opt/apps/elasticsearch-6.4.0/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip
查看插件安装列表
# sudo /opt/apps/elasticsearch-6.4.0/bin/elasticsearch-plugin list
IK配置
ik安装完毕后配置文件在 {ES_HOME}/config目录下, 本例目录是 /opt/apps/elasticsearch-6.4.0/config/analysis-ik/IKAnalyzer.cfg.xml
![a0acd1343ce65eacae569c09e4145e5d.png](https://i-blog.csdnimg.cn/blog_migrate/3731de44430185121d85dccddfc0ea14.jpeg)
IK自定义词典维护
文本词典
ik文本词典均是以dic结尾,换行符作为分隔,示例如下:
![216dd90c212c6265cf74154d55ec4a66.png](https://i-blog.csdnimg.cn/blog_migrate/1df800c139957e964372eb0ea1ef13b1.jpeg)
重启es,注意一定要重启es
通过前面教程中,我们发现短语"我爱祖国",会被分词为, "我","爱","祖国"三个词, 如果按照上面词典定义后, "我爱祖国"会被当成一个词语不被分词。
热更新远程词典
热更新远程词典的优势是,修改词典后无需重启es。每分钟加载一次
修改IK配置文件如下:
![4e20d548fac50b732c54c791d5d40f2d.png](https://i-blog.csdnimg.cn/blog_migrate/3a71934dc0a09b02d10c8b8fd835ab49.jpeg)
其中 location 是指一个 url,比如 http://yoursite.com/getCustomDict,该请求只需满足以下两点即可完成分词热更新。
1·该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
2·该 http 请求返回的内容格式是一行一个分词,换行符用 n 即可。
满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。
可以将需自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。
本文将远程词典存入数据库,示例如下:
![671874bcea62cb29ee59964c423530ce.png](https://i-blog.csdnimg.cn/blog_migrate/bff2c69a80f70bb28bb73562f24fab35.jpeg)
hanlp 中文分词器
截止目前,hanlp词库是最大,分词效果是最好。使用hanlp分词插件之前,建议先点击此处学习一下hanlp
安装hanlp中文分词器插件
hanlp的elasticsearch插件众多,这里选用了这个,这个插件支持的分词模式要多一些,截止现在此插件最新支持6.3.2,由于插件中包含很大的词典文件,建议此插件采用离线安装
![6ae0ac03bd5b98141ec8d106b4977463.png](https://i-blog.csdnimg.cn/blog_migrate/3ff4ac737cbbc0c886436944f7c91ab2.jpeg)
查看插件安装列表
![5dd1b407c1a9994bae6247838246af20.png](https://i-blog.csdnimg.cn/blog_migrate/316a77efde1a85b13db4ddb64a86a1b6.jpeg)
注意: 这里有一个hanlp的警告,es版本是6.4.0, 但是插件允许的es版本是6.3.2
上面的警告需要修改一下插件配置, 本方法仅限于博主对应的版本哟,其他版本没去试验
# sudo vim /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/plugin-descriptor.properties
将 elasticsearch.version=6.3.2 修改为 elasticsearch.version=6.4.0,再次查看插件列表
ok,安装成功,安装完毕后必须重启es哟必须重启es哟必须重启es哟
hanlp配置
![f7b882f894026f43e2aef85be2907a53.png](https://i-blog.csdnimg.cn/blog_migrate/cdc2d4bde39d22bc0326083c021f38fb.jpeg)
hanlp自定义词典
hanlp语料库词典
hanlp语料库地址为: https://github.com/hankcs/HanLP/releases, 本文截止目前最新版本为1.6.8
1·下载数据包 http://hanlp.linrunsoft.com/release/data-for-1.6.8.zip
2·解压到配置文件中key为root的值对应目录下
3·根据词典名调整hanlp配置中的词典配置,尤其注意CustomDictionaryPath的配置,以前采用的应用名,现在采用的中文名称
4·删除二进制缓存文件 rm -r /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/data/dictionary/custom/CustomDictionary.txt.bin, 如果自定义词典变更了,一点要执行这一步,否则词典不生效
5·一定要重启es!!!一定要重启es!!!一定要重启es!!!
hanlp自定义热更新词典
1·在配置文件中key为root的值对应目录下找到目录custom,进入此目录
2·创建一个txt文件,示例: myDic.txt
3·在myDic.txt文件中添加词,分隔符为换行符, 词典格式为: [单词] [词性A] [A的频次] ,如图:
4·删除二制缓存文件 rm -r /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/data/dictionary/custom/CustomDictionary.txt.bin, 如果自定义词典变更了,一点要执行这一步,否则词典不生效
一定要重启es!!!一定要重启es!!!一定要重启es!!!
.