Elasticsearch iK分词器添加自定义词库

1,434 阅读2分钟

这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

Elasticsearch iK分词器添加自定义词库

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。

    1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
    1. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

这种方式更新不需要重新启动es服务