二十五、ElasticSearch的IK分词安装和简单使用及自定
1、在elasticsearch中安装ik中文分词器
我这里使用GIT去下载,大家也可以网上去下载
(1)git clone https://github.com/medcl/elasticsearch-analysis-ik
(2)git checkout tags/v5.2.0
(3)mvn package
(4)将target/releases/elasticsearch-analysis-ik-5.2.0.zip拷贝到es/plugins/ik目录下
(5)在es/plugins/ik下对elasticsearch-analysis-ik-5.2.0.zip进行解压缩
(6)重启es
2、ik分词器基础知识
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
3、ik分词器的使用
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"text": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
POST /my_index/my_type/_bulk
{ "index": { "_id": "1"} }
{ "text": "男子偷上万元发红包求交女友 被抓获时仍然单身" }
{ "index": { "_id": "2"} }
{ "text": "16岁少女为结婚“变”22岁 7年后想离婚被法院拒绝" }
{ "index": { "_id": "3"} }
{ "text": "深圳女孩骑车逆行撞奔驰 遭索赔被吓哭(图)" }
{ "index": { "_id": "4"} }
{ "text": "女人对护肤品比对男票好?网友神怼" }
{ "index": { "_id": "5"} }
{ "text": "为什么国内的街道招牌用的都是红黄配?" }
GET /my_index/my_type/_search
{
"query": {
"match": {
"text": "16岁少女结婚好还是单身好?"
}
}
}
4、自定义分词库及相关介绍
ik配置文件地址:es/plugins/ik/config目录
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;custom/single_word_low_freq.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
在IK的目录下,会有很多分词文件,里面有ik原生内置的中文词库、单位相关、姓氏、停用词、城市相关、繁体字等相关词库进行分词,我们也可以在里面加入相关的分词和停用词。
5、mysql实现热更新
每次都是在es的扩展词典中,手动添加新词语,很坑
(1)每次添加完,都要重启es才能生效,非常麻烦
(2)es是分布式的,可能有数百个节点,你不能每次都一个一个节点上面去修改
热更新的方案
(1)修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库
(2)基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头,来提供词语的热更新
Mysql实现方案:
(1)、下载源码https://github.com/medcl/elasticsearch-analysis-ik/tree/v5.2.0
(2)、修改源码
在Dictionary类的实例化方法中加入
图片2.png
HotDictReloadThrea类:就是死循环,不断调用Dictionary.getSingleton().reLoadMainDict(),去重新加载词典
图片3.png
Dictionary类加入一个自己写的方法去重新加载词典
图片4.png
Dictionary类的loadMainDict方法中加入一项去读取mysql中的表字典
![图片6.png](https://img.haomeiwen.com/i13523164/116c64936d128ccf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
配置文件,这样以后就改一次配置文件
图片7.png
图片8.png
通过MAVEN打包mvn package
target\releases\elasticsearch-analysis-ik-5.2.0.zip
解压缩ik压缩包
将mysql驱动jar,放入ik的目录下(需要与安装的mysql版本一样)
图片9.png
重启ES,后续在表中加入词就可以了
image.png
验证
image.png