我们在ES中最常用的中文分词器就是IK分词器,其项目地址为:https://github.com/medcl/elasticsearch-analysis-ik
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
下载时注意和es的版本对应,我们es版本为:8.6.2。所以我们下载 elasticsearch-analysis-ik-8.6.2.zip 解压包内容如下:
在ES home/plugins 目录下创建目录 ik,并将我们下载下zip包解压到 es_home/plugins/ik 目录下
重启 ES 服务
IK 分词器有如下方式使用:
analyzer 和 tokenizer 均可配置使用 ik 分词器,两种配置对应的值均为如下两个:
{
"analyzer" : "ik_max_word",
"text" : "我们都是中国人"
}
或
{
"tokenizer" : "ik_max_word",
"text" : "我们都是中国人"
}
解析结果:
{
"tokens": [
{
"token": "我们",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "都是",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "中国人",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 2
},
{
"token": "中国",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 3
},
{
"token": "国人",
"start_offset": 5,
"end_offset": 7,
"type": "CN_WORD",
"position": 4
}
]
}
{
"tokenizer" : "ik_smart",
"text" : "我们都是中国人"
}
解析结果:
{
"tokens": [
{
"token": "我们",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "都是",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "中国人",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 2
}
]
}
在 ik 的文件的 config 目录下有 ik 分词的配置文件(IKAnalyzer.cfg.xml)以及相关的 dic 字典文件。
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置comment>
<entry key="ext_dict">entry>
<entry key="ext_stopwords">entry>
properties>
注释说得很明确了,我们来总结一下就是 IK 支持两种扩展方式:
- 本地 dic 文件扩展
- 远程配置扩展
在文件中添加我们要扩展的词
科比布莱恩特
我们就加科比的名字吧
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置comment>
<entry key="ext_dict">my_ext_dic.dicentry>
<entry key="ext_stopwords">entry>
properties>
{
"tokenizer" : "ik_max_word",
"text" : "NBA篮球巨星,科比布莱恩特中国行"
}
查看结果,最终的分词中一定会有“科比布莱恩特”这样完整的词语。
words_location 需要替换为我们远程的url,比如:https://aaaa.com/dics
远程扩展字典的方式无需重启 ES 服务,只是在字典管理上来说,扩展字段文件独立于 ES 服务了,可能带来不便