赞
踩
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分词器是怎样进行分词的?
ik分词器是一种基于字典和规则的中文分词器,其分词过程可以简要描述如下:
文本预处理:首先将输入的文本进行预处理,包括去除特殊字符、停用词等操作。
正向最大匹配:ik分词器采用正向最大匹配算法,即从左向右扫描文本,在词典中查找以当前位置开始的最长匹配词。
词典匹配:ik分词器使用内置的词典来匹配词语。如果当前位置的字符组合在词典中找到了匹配的词语,则将其作为一个词语输出。
细粒度切分:当出现歧义情况时,ik分词器会根据一定的规则进行细粒度切分,以解决歧义问题。
返回结果:最终将分词结果返回给用户,用户可以根据需要进行后续的文本处理或分析。
总的来说,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 } ] }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。