ELK技术-IK-中文分词器
1.背景
1.1 简介
ES默认的分词器对中文分词并不友好,所以一般会安装中文分词插件,以便能更好的支持中文分词检索。
本例参考文档:《一文教你掌握IK中文分词》
1.2 IK分词器
IK分词器在是一款基于词典和规则的中文分词器。这里讲解的IK分词器是独立于Elasticsearch、Lucene、Solr,可以直接用在java代码中的部分。实际工作中IK分词器一般都是集成到Solr和Elasticsearch搜索引擎里面使用。
IK分词采用Java编写。
IK分词的效果主要取决于词库,目前自带主词典拥有27万左右的汉语单词量。对于应用领域的不同,需要各类专业词库的支持。词库还可以自己维护。
IK分词器地址://github.com/medcl/elasticsearch-analysis-ik
IK分词器有两种分词模式:ik_max_word和ik_smart。
下载安装包
- 下载预编译的安装包,下载地址://github.com/medcl/elasticsearch-analysis-ik/releases
- 下载对应版本,IK版本与Elasticsearch版本一致
- 将IK包加入到Elasticsearch插件目录下,新建ik目录,参考如下:
1.3 分词模式
IK分词器有两种分词模式:
- 细粒度模式 ik_max_word
- 智能模式 ik_smart
细粒度模式
采用细粒度模式ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合。测试代码:
GET /_analyze { "text": ["中华人民共和国国歌"], "analyzer": "ik_max_word" }
分词规则
- 当查询词在词典中不存在时,会按字拆分。如:在风->在,风
- 当查询词在词典中存在,且长度为两个字时,有时拆分有时不拆分。例如:甲乙–>甲乙 , 联通–>联通,联,通
- 当查询词在词典中存在,且查询词的一部分也在词典在中存在,则分别拆分。例如:甲乙丙丁–>甲乙丙丁,甲乙,丙丁 中国联通–>中国联通,中国,国联,联通,通
- 当查询词任意部分都不在词典中存储,则按字拆分
智能模式
智能模式ik_smart会做最粗粒度的拆分。比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
GET /_analyze { "text": ["中华人民共和国国歌"], "analyzer": "ik_smart" }
分词规则
- 当查询词在词典中不存在时,会按字拆分 例如:在北–>在,北
- 当查询词在词典中存在,不做拆分 例如:甲乙–>甲乙,甲乙丙丁–>甲乙丙丁
- 当查询词任意部分都不在词典中存储,则按字拆分
2.分词实践
2.1 词典配置
很多时候默认的分词效果达不到线上使用的要求,这就需要不断维护扩展词典和停止词字典,提高分词匹配的准确性,优化用户体验。
在IK分词器中,主要可以维护2种词典,一种是扩展词典,可以自定义一些词语,提高分词精读。
另一种是停止词词典,停止词就是指不会被分词拆分出来的词语,不参与分词和检索操作。
可以通过修改IKAnalyzer.cfg.xml配置文件,来自定义词典。IKAnalyzer.cfg.xml的位置为{plugins}/ik/config/。
注意事项
- ext_dict:直接修改ext_dict属性中配置的字段里面的内容,并不能立刻生效。只有重启ES进程实例,修改的内容才会生效。
- remote_ext_dict:通过远程扩展的字典,可以实现词典的热更新,不用重启ES进程实例。
2.2 词典热更新
配置词典代理
配置词典源有多种模式,如tomact容器,Nginx代理等,本例基于Nginx配置代理如下:
Nginx按照参考:《Nginx按照教程》
server { listen 8084; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /ik-remote-dic { alias /opt/elasticsearch/ik-config; autoindex on; } ........
设置词典值
在目录下设置数据词典(本例为: /opt/elasticsearch/ik-config),由于是中文分词,特别注意文件的字符格式(UTF-8),参考如下:
配置远程词典源
2.3 分词应用
关键词查询,未做扩展的数据字典:
GET /_analyze { "text": "成都数康公司,通商速子股份有限公司,字节不跳动公司,头颅后侧位工时,王令", "analyzer": "ik_smart" }
关键词查询,做扩展的数据字典:
GET /_analyze { "text": "重庆数康公司,通商数字股份有限公司,字节跳动公司,头颅正侧位工时,王令,王玲的报告,测试是报告", "analyzer": "ik_smart" }