引言:ik分词器的分词范围不够广泛。某些特定行业的专业用语分词能力就不够了,此时就需要自定义分词,与停顿词。

1、下载ik分词器源码

git地址:https://github.com/medcl/elasticsearch-analysis-ik/releases?page=2

下载对应的elasticsearch版本。以7.17.3为例子。下载源码后在idea中打开

2、创建对应数据表

分词表、停止词表。需要字段id,word

3、修改pom文件

修改成对应的elasticsearch的版本号

4、添加mysql依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version>
</dependency>

5、创建数据库配置文件jdbc-reload.properties,放在IK项目的config文件夹下

jdbc.url=jdbc:mysql://192.168.101.109:3306/user_test?serverTimezone=UTC
jdbc.user=root
jdbc.password=123456
jdbc.reload.extend.sql=select word from es_extend_word
jdbc.reload.stop.sql=select word from es_stop_word
# 间隔时间 毫秒
jdbc.reload.interval=1000

6、IK分词器加载分词的源码在witea.analyzer.dic.Dictionary类中,打开这个类,添加如下方法

两个加载分词的方法可以模仿自带的加载分词方法来写,具体如下:
添加加载拓展词方法

/*** 加载自定义数据库拓展词典到主词库表* 55555 20211216*/public void loadExtendDictFromMysql(){Connection connection = null;Statement statement = null;ResultSet resultSet = null;try{Path file = PathUtils.get(getDictRoot(),"jdbc-reload.properties");props.load(new FileInputStream(file.toFile()));logger.info("loading jdbc-reload.properties");for (Object key : props.keySet()) {logger.info(key + "=" + props.getProperty(String.valueOf(key)));}logger.info(" hot dict " + props.getProperty("jdbc.reload.extend.sql"));connection = DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.user"),props.getProperty("jdbc.password"));statement = connection.createStatement();resultSet = statement.executeQuery(props.getProperty("jdbc.reload.extend.sql"));while (resultSet.next()){// 加载扩展词典数据到主内存词典中String theWord = resultSet.getString("word");logger.info(theWord);_MainDict.fillSegment(theWord.trim().toLowerCase().toCharArray());}// 加载时间Thread.sleep(Integer.valueOf(String.valueOf(props.get("jdbc.reload.interval"))));}catch (Exception e){logger.error("[Extend Dict Loading] "+ e);}finally {if(resultSet != null){try {statement.close();} catch (SQLException e) {logger.error("[Extend Dict Loading] " + e);}}if(connection != null){try {connection.close();} catch (SQLException e) {logger.error("[Extend Dict Loading] " + e);}}}}

添加加载停用词方法

/*** 加载自定义数据库拓展停止词词典到主词库表* 55555 20211216*/public void loadStopDictFromMysql(){// 建立主词典实例_StopWords = new DictSegment((char) 0);Connection connection = null;Statement statement = null;ResultSet resultSet = null;try{Path file = PathUtils.get(getDictRoot(),"jdbc-reload.properties");props.load(new FileInputStream(file.toFile()));logger.info("loading jdbc-reload.properties");for (Object key : props.keySet()) {logger.info(key + "=" + props.getProperty(String.valueOf(key)));}logger.info(" stop dict " + props.getProperty("jdbc.reload.stop.sql"));connection = DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.user"),props.getProperty("jdbc.password"));statement = connection.createStatement();resultSet = statement.executeQuery(props.getProperty("jdbc.reload.stop.sql"));while (resultSet.next()){// 加载扩展词典数据到主内存词典中String theWord = resultSet.getString("word");logger.info(theWord);_StopWords.fillSegment(theWord.trim().toLowerCase().toCharArray());}// 加载时间Thread.sleep(Integer.valueOf(String.valueOf(props.get("jdbc.reload.interval"))));}catch (Exception e){logger.error("[Stop Dict Loading] "+ e);}finally {if(resultSet != null){try {statement.close();} catch (SQLException e) {logger.error("[Stop Dict Loading] " + e);}}if(connection != null){try {connection.close();} catch (SQLException e) {logger.error("[Stop Dict Loading] " + e);}}}}

7、在loadMainDict()中添加自定义的加载拓展词的方法

8、在loadStopWordDict方法中添加自定义的加载停止词的方法

9、因为需要加载数据库,因此需要加载数据库驱动器,在Dictionary中添加:

static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {logger.error("error", e);}}

10、使用maven将项目打包:

注意:这里的版本是否对应elasticsearch的版本

11、将打包好的ik分词器添加到es/plusgins目录下,将原来的ik分词器删除,将新的重新解压并重命名为ik

12、将mysql驱动器jar包添加到ik分词器目录下

/elasticsearch-7.17.3/plugins/ik

13、重启es

1、ps -ef|grep elasticsearch   #查看es进程号

2、kill -9 "进程号"

3、cd "es的目录中"

4、bin/elasticsearch -d #后台启动

14、kibana中测试

es7.x版本以上的,可以使用es自带的jdk。用自带的jdk时,会有一个让人头疼的问题。启动会报错,此时需要去添加jdk的权限

grant {
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans";
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.beans.*";
    permission java.lang.RuntimePermission "accessClassInPackage.com.sun.java.swing.plaf.*";
    permission java.lang.RuntimePermission "accessClassInPackage.com.apple.*";
    permission java.lang.RuntimePermission "setContextClassLoader";
    // ip:3306是拓展词数据库ip和端口
    permission java.net.SocketPermission "ip:3306","connect,resolve";

};

原文:Elastic:IK分词器分词、停用词热更新如何配置(二)基于数据库_wu@55555的博客-CSDN博客

Ik分词器(自定义分词-mysql)相关推荐

  1. IK分词器-自定义分词算法与自定义分词配置

    一.分词的概念 分词:就是把我们要查询的数据拆分成一个个关键字,我们在搜索时,ElasticSearch会把数据进行分词,然后做匹配.默认的中文分词器会把每一个中文拆分,比如"迪丽热巴&qu ...

  2. IK分词器-自定义分词

    我们首先测试一下IK分词器的ik_smart最少切分策略. GET _analyze {"analyzer": "ik_smart","text&qu ...

  3. android sqlite 分词,sqlite3自定义分词器

    sqlite3通过使用fts3虚表支持全文搜索,默认支持simple和porter两种分词器,并提供了接口来自定义分词器.这里我们利用mmseg来构造自定义的中文分词器. 虽然sqlite在fts3_ ...

  4. CentOS安装Elasticsearch_IK分词器拼音分词器_部署kibana_部署es集群

    CentOS安装Elasticsearch_IK分词器_部署kibana_部署es集群 一.部署单点es ①:创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联.这里先 ...

  5. Elasticsearch配置ik中文分词器自定义词库

    1.IK配置文件 在config目录下: IKAnalyzer.cfg.xml:配置自定义词库 main.dic:分词器自带的词库,索引会按照里面的词创建 quantifier.dic:存放计量单位词 ...

  6. Elasticsearch配置拼音分词和自定义分词器

    下载elasticsearch-analysis-pinyin拼音分词器  https://codeload.github.com/medcl/elasticsearch-analysis-pinyi ...

  7. IKAnalyzer分词器自定义扩展词典

    IKAnalyzer下载地址:https://download.csdn.net/download/fadgafdgfdg/10666914 下载IKAnalyzer完整分发包后,IK Analyze ...

  8. es自定义分词器和分词规则

    1.analysis 和 analyzer analysis是指把全文本转换成一系列单词(term/token)的过程,也叫分词. analysis是通过分词器analyzer来实现的 2.分词 St ...

  9. docker使用小记——docker安装es+ik分词器+拼音分词器+kibana

    一.docker安装:Windows Docker 安装 | 菜鸟教程 二.docker换镜像源 修改或新增 /etc/docker/daemon.json vi /etc/docker/daemon ...

  10. 【lucene】lucene 分词 以及自定义分词器

    1.概述 分词器基本分为四类,SimpleAnalyzer,StopAnalyzer,WhitespaceAnalyzer,StandardAnalyzer. 2.Token 这里主要涉及 Token ...

最新文章

  1. 难点电路详解之负反馈放大器电路(1)
  2. Notepad++使用vs2015主题教程
  3. 企业网站建设|优秀的网站都是靠这些细节做成功的
  4. spring cloud 配置中心
  5. 无空头链表详解(增删改查)
  6. PHP语言文件,最有效的方法来做PHP语言文件?
  7. Oracle数据库名,实例名,服务名的区别
  8. 网络IPC:套接字之套接字描述符
  9. 模拟登陆教务处获取成绩
  10. 转 五种提高 SQL 性能的方法
  11. 怎样才能使用域名访问网站?
  12. My Eighty-first Page - 打家劫舍 - By Nicolas
  13. 黄金比例在设计上的应用
  14. 全国大学生智能车竞赛2022年-智能汽车竞赛发展沙龙
  15. turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
  16. 20款免费项目管理系统推荐
  17. 游戏开发人员推荐书单
  18. 抓包工具fiddler
  19. web前端实训作业 html+css+javascript 水果超市网页设计实例 企业网站制作
  20. 用计算机无法解决,电脑不能打字是怎么回事【 解决方案】

热门文章

  1. 关于 Linux 中 firewalld 的一些笔记整理
  2. PHP上传图片和显示
  3. 计算机的音乐数字要全是数字,数字中的音乐
  4. 2021届双非本科的心酸秋招经历总结及经验分享
  5. unsigned long long类型与long long类型
  6. 是时候更新Android Studio 3.5了!不信,你看~
  7. linux设置网络 命令,Linux网络配置相关命令
  8. 神秘的 Allocator
  9. AD142A0芯片程序空间资源空间分布的总结
  10. MySQL数据库文件