这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战
Elasticsearch iK分词器添加自定义词库
之前做词云分词使用的是Elasticsearch 做的传送门 大体流程如下:
graph TD
创建索引 --> 设置自定义分词器 --> 查看分词结果
创建索引
curl -XPUT http://localhost:9200/index
设置索引mapping
curl -XPOST http://localhost:9200/index/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
具体说一下ik_smart和ik_max_word的区别 官方说明: ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query; ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
查看分词结果
curl -XPOST http://localhost:9200/index/_analyze -H 'Content-Type:application/json' -d'
{
"analyzer": "custom_analyzer",
"text": "米线偏硬"
}'
显示结果: 米线,偏,硬 在线查看分词结果
需求是想要偏硬这个词,不想分开查看。显然普通的词库已经不能满足我们的需求,需要自定义增加词库 当然ik分词器是支持让用户添加自定义词库操作的
手动修改
cd {conf}/analysis-ik/config/IKAnalyzer.cfg.xml or {plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml
创建custom/mydic.dic文件夹和文件, mydic.dic文件中添加自定义词,以/n分割
zai 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">custom/mydict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>
这种方式更新需要重新启动es服务
热更新
在上面说的文件中可以设置远程地址,即热更新
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">location</entry>
location 是一个url。
-
- 该 http 请求需要返回两个头部(header),一个是
Last-Modified,一个是ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
- 该 http 请求需要返回两个头部(header),一个是
-
- 该 http 请求返回的内容格式是一行一个分词,换行符用
\n即可。
- 该 http 请求返回的内容格式是一行一个分词,换行符用
这种方式更新不需要重新启动es服务