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目录下创建):文章来源:https://www.toymoban.com/news/detail-839532.html曼诺尔 雷迪亚兹 白嫖
-
重启(
docker restart es
)测试文章来源地址https://www.toymoban.com/news/detail-839532.htmlGET /_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 } ] }
到了这里,关于ES分布式搜索-IK分词器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!