Elasticsearch-IK分词器详解以及源码修改实现mysql热更新

  • IK分词器的安装和使用
    访问ik分词器github项目地址:https://github.com/medcl/elasticsearch-analysis-ik
    1.在本地clone项目代码,git clone https://github.com/medcl/elasticsearch-analysis-ik.git
    2.切换到对应本地elasticsearch版本号的tag,git checkout tags/5.5.2
    3.通过maven进行项目打包,mvn package
    4.拷贝/target/release/xxx.zip到/es/plugins/ik下面并解压出来(注意层级关系,ik目录下直接是解压后的所有文件,不能够再有文件夹目录)
    5.重启elasticsearch服务未报错即可

IK分词器有两种Analyzer: ik_smart , ik_max_word,前者会做粗粒度的拆分,后者会做细粒度的尽可能多的拆分,一般使用后者来进行对中文的分词处理


  • IK分词器的使用
PUT /my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "text":{
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}
GET /_analyze
{
  "text":"你好 我来自深圳市 正在学习搜索技术",
  "analyzer": "ik_max_word"
}

结果可以看到被分成了很多个词

  • IK分词器配置文件详解以及自定义词库
    • 找到ik/config目录下IKAnalyzer.cfg.xml文件,用来配置自定义词库
    • main.dic是原生词库总共27万,只要是这些词,都会被分词在一起
    • quantifier.dic是一些单位的相关词
    • suffix.dic是一些地方相关的后缀
    • surname.dic是一些姓相关的词
    • stopword.dic是英文停用词

最重要的配置是main.dic和stopword.dic

自定义词库:
修改IKAnalyzer.cfg.xml配置文件,配置自定义扩展词库和停词词库:

<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">custom/mydict.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">custom/ext_sotpword.dic</entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

在custom/mydict.dic和custom/ext_sotpword.dic下添加自定义的停用词然后重启es

➜  config cat mydict.dic 
网红
蓝瘦香菇
鬼畜

添加以上自定义词语,然后再进行分词测试

GET /my_index/_analyze
{
  "text":"蓝瘦香菇 ",
  "analyzer": "ik_max_word"
}
返回
{
  "tokens": [
    {
      "token": "蓝瘦香菇",
      "start_offset": 0,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "香菇",
      "start_offset": 2,
      "end_offset": 4,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}

  • 修改IK分词器源码来基于mysql热更新词库
    对于分布式的es集群,不可能去每个节点手动添加自定义的词语,还要保证不停机
    两种热更新的方案:
    • 1.修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库
    • 2.基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag响应头,来提供词语的热更新

通常会采用第一种方案,对于第二种官方也不推荐,因为不太稳定

修改源码步骤如下:
1、下载源码

https://github.com/medcl/elasticsearch-analysis-ik/tree/v5.2.0

ik分词器,是个标准的java maven工程,直接导入eclipse就可以看到源码

2、修改源码

Dictionary类,169行:Dictionary单例类的初始化方法,在这里需要创建一个我们自定义的线程,并且启动它
HotDictReloadThread类:就是死循环,不断调用Dictionary.getSingleton().reLoadMainDict(),去重新加载词典
Dictionary类,389行:this.loadMySQLExtDict();
Dictionary类,683行:this.loadMySQLStopwordDict();

3、mvn package打包代码

target\releases\elasticsearch-analysis-ik-5.2.0.zip

4、解压缩ik压缩包

将mysql驱动jar,放入ik的目录下

5、修改jdbc相关配置

6、重启es

观察日志,日志中就会显示我们打印的那些东西,比如加载了什么配置,加载了什么词语,什么停用词

7、在mysql中添加词库与停用词

8、分词实验,验证热更新生效

修改源码后的代码示例:
https://github.com/huiGod/elasticsearch-analysis-ik-5.2.0-mysql

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值