← 返回首页
添加自定义词库
发表时间:2024-01-03 09:02:03
添加自定义词库

添加自定义词库。

针对一些特殊的词语在分词的时候也需要能够识别。 例如:2023年是一带一路思想提出十周年,一带一路称为网络上新的流行词语。

假如:新闻网站标题是:中国一带一路网基于平台数据进行了年度盘点。

我们期望elasticsearch可以搜索出"一带一路"关键字。

1.添加自定义词库

实现步骤如下:

下面演示一下如何在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
    }
  ]
}

现在发现"一带一路"这个词语可以被识别出来了,说明自定义词库生效了。