添加自定义词库。
针对一些特殊的词语在分词的时候也需要能够识别。 例如:2023年是一带一路思想提出十周年,一带一路称为网络上新的流行词语。
假如:新闻网站标题是:中国一带一路网基于平台数据进行了年度盘点。
我们期望elasticsearch可以搜索出"一带一路"关键字。
实现步骤如下:
下面演示一下如何在IK中自定义词库:
1).首先在ik插件对应的配置文件目录下创建一个自定义词库文件my.dic 首先在master节点上操作。切换到es用户,进入到ik插件对应的配置文件目录。该目录路径为: $ES_HOME/config/analysis-ik
创建自定义词库文件my.dic,直接在文件中添加词语即可,每一个词语一行。
一带一路
注意:这个my.dic词库文件既可以在Linux中直接使用vim命令创建,也可以在Windows中创建之后上传到这个配置目录。但是要求文件必须使用UTF-8 without BOM 格式。
2).修改ik的IKAnalyzer.cfg.xml配置文件
进入到ik插件对应的配置文件目录中,修改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">my.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
注意:需要把my.dic词库文件添加到key="ext_dict"这个entry中,切记不要随意新增entry,随意新增的entry是不被IK识别的,并且entry的名称也不能乱改,否则也不会识别。
如果需要指定多个自定义词库文件的话需要使用分号;隔开。 例如:
<entry key="ext_dict">my.dic;your.dic</entry>
注意:如果是多个节点的ES集群,一定要把配置远程拷贝到其他节点。
3).把my.dic和IKAnalyzer.cfg.xml配置文件分发到slave1和slave2。
[root@master analysis-ik]# scp -rq my.dic slave1:/usr/local/elasticsearch/config/analysis-ik
[root@master analysis-ik]# scp -rq my.dic slave2:/usr/local/elasticsearch/config/analysis-ik
[root@master analysis-ik]# scp -rq IKAnalyzer.cfg.xml slave1:/usr/local/elasticsearch/config/analysis-ik
[root@master analysis-ik]# scp -rq IKAnalyzer.cfg.xml slave2:/usr/local/elasticsearch/config/analysis-ik
4).重启ES集群测试分词效果。
[es@master elasticsearch]$ curl -H "Content-Type: application/json" -XPOST 'http://master:9200/test/_analyze?pretty' -d '{"text":"中国一带一路网基于平台数据进行了年度盘点","tokenizer":"ik_max_word"}'
{
"tokens" : [
{
"token" : "中国",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "国一",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "一带一路",
"start_offset" : 2,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "一带",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "一",
"start_offset" : 2,
"end_offset" : 3,
"type" : "TYPE_CNUM",
"position" : 4
},
{
"token" : "带",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 5
},
{
"token" : "一路",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 6
},
{
"token" : "一",
"start_offset" : 4,
"end_offset" : 5,
"type" : "TYPE_CNUM",
"position" : 7
},
{
"token" : "路网",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 8
},
{
"token" : "路",
"start_offset" : 5,
"end_offset" : 6,
"type" : "COUNT",
"position" : 9
},
{
"token" : "网",
"start_offset" : 6,
"end_offset" : 7,
"type" : "CN_CHAR",
"position" : 10
},
{
"token" : "基于",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 11
},
{
"token" : "平台",
"start_offset" : 9,
"end_offset" : 11,
"type" : "CN_WORD",
"position" : 12
},
{
"token" : "台数",
"start_offset" : 10,
"end_offset" : 12,
"type" : "CN_WORD",
"position" : 13
},
{
"token" : "数据",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 14
},
{
"token" : "进行了",
"start_offset" : 13,
"end_offset" : 16,
"type" : "CN_WORD",
"position" : 15
},
{
"token" : "进行",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 16
},
{
"token" : "行了",
"start_offset" : 14,
"end_offset" : 16,
"type" : "CN_WORD",
"position" : 17
},
{
"token" : "年度",
"start_offset" : 16,
"end_offset" : 18,
"type" : "CN_WORD",
"position" : 18
},
{
"token" : "盘点",
"start_offset" : 18,
"end_offset" : 20,
"type" : "CN_WORD",
"position" : 19
}
]
}
现在发现"一带一路"这个词语可以被识别出来了,说明自定义词库生效了。