Ik分词器(自定义分词-mysql)

article/2025/9/13 17:38:46

引言: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博客


http://chatgpt.dhexx.cn/article/vKCtAGSC.shtml

相关文章

分词器详解

在全文搜索&#xff08;Fulltext Search&#xff09;中&#xff0c;**词&#xff08;Term&#xff09;**是一个搜索单元&#xff0c;表示文本中的一个词&#xff0c;**标记&#xff08;Token&#xff09;**表示在文本字段中出现的词&#xff0c;由词的文本、在原始文本中的开始…

ES-分词器

简介 分词器是es中的一个组件&#xff0c;通俗意义上理解&#xff0c;就是将一段文本按照一定的逻辑&#xff0c;分析成多个词语&#xff0c;同时对这些词语进行常规化的一种工具&#xff1b;ES会将text格式的字段按照分词器进行分词&#xff0c;并编排成倒排索引&#xff0c;…

IK分词器

IK分词器是ES的一个插件&#xff0c;主要用于把一段中文或者英文的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词器是将每个字看成一个词,比如"我爱技术"会被分为"我…

Elasticsearch连续剧之分词器

目录 一、前言二、默认分词器三、IK分词器1.主要算法2.安装IK分词器2.1 关闭es服务2.2 上传ik分词器到虚拟机2.3 解压2.4 启动ES服务2.5 测试分词器效果2.6 IK分词器词典 四、拼音分词器1.安装2.测试分词效果 五、自定义分词器1.创建自定义分词器2.测试 一、前言 ES文档的数据…

jieba分词

一、jieba简介 jieba库是一款优秀的 Python 第三方中文分词库&#xff0c;jieba 支持三种分词模式&#xff1a;精确模式、全模式和搜索引擎模式&#xff0c;下面是三种模式的特点。 精确模式&#xff1a; 试图将语句最精确的切分&#xff0c;不存在冗余数据&#xff0c;适合做…

NLP-分词综述

NLP-分词综述 一、什么是分词&#xff1f;二、为什么要分词1、将复杂问题转化为数学问题2. 词是⼀个⽐较合适的粒度3. 深度学习时代&#xff0c;部分任务中也可以「分字」 三、中英⽂分词的3个典型区别1.分词⽅式不同&#xff0c;中⽂更难2.英⽂单词有多种形态3.中⽂分词需要考…

Jieba中文分词 (一) ——分词与自定义字典

jieba分词特点 支持四种分词模式&#xff1a; 精确模式试图将句子最精确地切开&#xff0c;适合文本分析&#xff1b;全模式把句子中所有的可以成词的词语都扫描出来, 速度非常快&#xff0c;但是不能解决歧义&#xff1b;搜索引擎模式在精确模式的基础上&#xff0c;对长词再次…

【NLP学习】中文分词

word segmentation 1.概述2.分词方法(1)基于词典的机械分词法①正向最大匹配&#xff08;FMM&#xff09;②逆向最大匹配&#xff08;BMM&#xff09;③双向最大匹配 (2)基于统计的分词法①基于互信息的分词方法②最大概率分词方法 3.分词粒度4.中文分词工具5.总结 1.概述 *◆…

基于字典的中文分词

中文分词介绍 中文分词就是将一个汉语句子中的词切分出来。为机器翻译、文本挖掘、情感分析等任务打好基础。为什么一定要先进行分词呢&#xff1f;这就像 26 个字母一样&#xff0c;单个字母并不能表达某个意思&#xff0c;将其组合起来成为一个英文单词才有意义。 中文虽然有…

【ElasticSearch】中文分词器

ES默认的analyzer&#xff08;分词器&#xff09;&#xff0c;对英文单词比较友好&#xff0c;对中文分词效果不好。不过ES支持安装分词插件&#xff0c;增加新的分词器。 1、如何指定analyzer&#xff1f; 默认的分词器不满足需要&#xff0c;可以在定义索引映射的时候&#…

Elasticsearch之中文分词器

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【一心同学】&#xff0c;一位上进心十足的【Java领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; ✨【一心同学】的写作风格&#x…

各种中文分词工具的使用方法

诸神缄默不语-个人CSDN博文目录 本文将介绍jieba、HanLP、LAC、THULAC、NLPIR、spacy、stanfordcorenlp、pkuseg等多种中文分词工具的简单使用方法。 对于可以在多种语言上使用的工具&#xff0c;本文仅介绍其在Python语言上的使用。 文章目录 1. jieba2. HanLP3. LAC4. THULA…

中文分词方法

词条化 分词又叫做词条化&#xff08;tokenlize&#xff09;&#xff0c;指的是将原始的字符流转换成一个一个词条&#xff08;token&#xff09;的过程。词条化属于自然语言处理中预处理的一个步骤&#xff0c;它是分析语义的基础。下图是一个词条化的例子。 在不同的语言中&…

细说中文分词

完整的中文自然语言处理过程一般包括以下五种中文处理核心技术&#xff1a;分词、词性标注、命名实体识别、依存句法分析、语义分析。其中&#xff0c;分词是中文自然语言处理的基础&#xff0c;搜素引擎、文本挖掘、机器翻译、关键词提取、自动摘要生成等等技术都会用到中文分…

【Grails4+spring security】

Grails4spring security实现单用户登录 描述1、新建项目目录结构如图所示2、打开根目录下的build.gradle文件&#xff0c;dependencies中添加spring-security依赖3、创建用户、角色的domain4、创建登录控制器LoginController5、创建注销控制器 LogoutController6、自定义一个Co…

Grails配置-基本配置-如何覆盖默认配置,在哪里进行自定义配置

文章目录 Grails配置基本配置⎮Grails4风格配置⎮Grails2风格的Groovy配置⎮使用GrailsApplication对象访问配置信息 在控制器中使用grailsApplication对象 能获取到的配置信息有哪些 在业务层中使用grailsApplication对象方式一 在业务层中使用grailsApplication对象方式二…

Grails 的插件开发

警告&#xff1a;本文还未整理&#xff0c;可读性差&#xff0c;还只是草稿 文档 Grails Plugin Develop Document grails-spring-security-core 插件文档 grails-spring-security-rest插件 文档 创建插件 执行命令行 grails create-plugin <<PLUGIN NAME>>即…

Grails配置-启动类配置,数据源配置,连接Mysql数据库

文章目录 Grails配置1. 启动类配置Application.groovy启动类中可以做哪些事情1. 启动Grails应用程序2. 自定义包扫描路径3. 注册bean4. 应用程序生命周期管理 2. 环境配置2.1 默认的多环境配置2.2 预设的环境2.3 打包和运行使用不同的环境2.4 在代码启动过程中判断当前环境2.5 …

java grails mave_Grails 与 Maven 集成

Grails 与 Maven 集成 杨 健 2013 年 9 月 09 日发布 概述 Grails 简介&#xff1a;Grails 是一个开源的 Web 开发框架&#xff0c;它采用动态语言 Groovy 进行开发&#xff0c;并且可以和用 Java 开发的项目进行集成。Grails 充分体现了约定优于配置的原则&#xff0c;将项目的…

Grails4.0.11入门

文章目录 Grails4.0.11介绍相关依赖入门⎮Java环境搭建⎮Grails环境搭建⎮如何创建grails应用⎮如何选择开发工具IDEA如何导入Grails项目 ⎮目录结构&#xff0c;约定优于配置⎮如何部署Grails项目1. 使用默认内嵌的Tomcat8部署2. 使用外部Tomtcat8部署3. 使用外部Tomcat7部署 …