ES分词器-IK
1、为什么使用分词器?
es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。
我们在kibana的DevTools中测试:
GET /_analyze
{"analyzer": "ik_max_word","text": "程序员学习java太棒了"
}
语法说明:
-
POST:请求方式
-
/_analyze:请求路径,这里省略了http://192.168.12.131:9200,有kibana帮我们补充
-
请求参数,json风格:
-
analyzer:分词器类型,这里是默认的standard分词器
-
text:要分词的内容
-
由于kibana无法识别中文词汇,在没有使用IK分词器的情况下每一个中文会逐字进行识别保存查询,所以对效率和内存的耗损都有一些代价。
处理中文分词,一般会使用IK分词器。IK分词器GitHub官网
安装IK分词器,参考资料《安装elasticsearch.md》:
ik分词器包含两种模式(“analyzer”中添加):
- ik_smart:最少切分,粗粒度
- ik_max_word:最细切分,细粒度(分词之后的词语更多)
问题来了,ik分词器是怎样进行分词的?
ik分词器是一种基于字典和规则的中文分词器,其分词过程可以简要描述如下:
文本预处理:首先将输入的文本进行预处理,包括去除特殊字符、停用词等操作。
正向最大匹配:ik分词器采用正向最大匹配算法,即从左向右扫描文本,在词典中查找以当前位置开始的最长匹配词。
词典匹配:ik分词器使用内置的词典来匹配词语。如果当前位置的字符组合在词典中找到了匹配的词语,则将其作为一个词语输出。
细粒度切分:当出现歧义情况时,ik分词器会根据一定的规则进行细粒度切分,以解决歧义问题。
返回结果:最终将分词结果返回给用户,用户可以根据需要进行后续的文本处理或分析。
总的来说,ik分词器通过词典匹配和规则处理的方式对中文文本进行分词,以实现对文本的有效切分。
2、ik分词器-拓展和停用词条
假如现在有需求,字典实现个性化设置,比如说不能出现有关政治或国家领导人的关键词汇,过滤黄赌毒等关键词汇等,还有没有意思的词语如“的”等,而且词汇随着时代进步也会产生许多,也需要不含在字典里面。
-
要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的
IkAnalyzer.cfg.xml
文件:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">ext.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">stopword.dic</entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
-
然后在名为
ext.dic
和stopword.dic
的文件中,添加想要拓展的词语即可(没有记得在config目录下创建):曼诺尔 雷迪亚兹 白嫖
-
重启(
docker restart es
)测试GET /_analyze {"analyzer": "ik_smart","text": "曼诺尔雷迪亚兹真是个可恶的白嫖的人" }
{"tokens" : [{"token" : "曼诺尔","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "雷迪亚兹","start_offset" : 3,"end_offset" : 7,"type" : "CN_WORD","position" : 1},{"token" : "真是","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 2},{"token" : "个","start_offset" : 9,"end_offset" : 10,"type" : "CN_CHAR","position" : 3},{"token" : "可恶","start_offset" : 10,"end_offset" : 12,"type" : "CN_WORD","position" : 4},{"token" : "白嫖","start_offset" : 13,"end_offset" : 15,"type" : "CN_WORD","position" : 5},{"token" : "的人","start_offset" : 15,"end_offset" : 17,"type" : "CN_WORD","position" : 6}] }