700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > elasticsearch分词器词库热更新三种方案

elasticsearch分词器词库热更新三种方案

时间:2019-09-22 14:13:42

相关推荐

elasticsearch分词器词库热更新三种方案

文章目录

一、本地文件读取方式二、远程扩展热更新 IK 分词三、重写ik源码连接mysql

一、本地文件读取方式

首先进入elasticsearch目录的plugins目录下,查看目录结构

2.进入confg目录下 创建文件mydic.dic 并添加:“我是中国人”

3.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:

4.保存启动es 观察日志

加载完成

二、远程扩展热更新 IK 分词

1.创建远程热更新词库(我用的nginx,在nginx静态资源目录html下创建hotUpdateLexicon.dic并写入词汇待会方便观察日志)如下:

2.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:

3.重启es观察日志

reload ik dict finished(重新加载完成)

三、重写ik源码连接mysql

1.下载源码包 链接: link. 找到对应版本

2、用idea打开找到词典管理类如下图

3.在config目录下添加jdbc.yml

jdbc:url: jdbc:mysql://localhost:3306/one?useUnicode=true&autoReconnect=true&failOverReadOnly=false&characterEncoding=utf8&useSSL=false&serverTimezone=UTCuser: rootpassword : rootsql: SELECT keyword FROM hot_words WHERE flag=0

4 .添加mysql maven库依赖

src\main\assemblies\plugin.xml如下:

添加配置使得数据库相关依赖一并打包

修改代码

static {try {//利用反射把mysql驱动加载到内存Class.forName("com.mysql.jdbc.Driver").newInstance();} catch (Exception e) {e.printStackTrace();}}/*** 从mysql加载热更新词典*/private void loadExtDictByMysql() {Connection conn = null;Statement stmt = null;ResultSet rs = null;Properties prop = null;InputStream inputStream = null;try {prop = new Properties();inputStream = inputStream = new FileInputStream(PathUtils.get(getDictRoot(), "jdbc.yml").toFile());prop.load(inputStream);conn = DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("user"),prop.getProperty("password"));stmt = conn.createStatement();rs = stmt.executeQuery(prop.getProperty("sql"));while (rs.next()) {String theWord = rs.getString("keyword");_MainDict.fillSegment(theWord.trim().toCharArray());}logger.info("从mysql加载热更新词典成功!");} catch (Exception e) {logger.error("error", e);} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}if (rs != null) {try {rs.close();} catch (SQLException e) {logger.error("error", e);}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {logger.error("error", e);}}if (conn != null) {try {conn.close();} catch (SQLException e) {logger.error("error", e);}}}}

5.放入线程池 延迟执行任务(时间感兴趣可以写成配置文件形式,当前Dictionary类)

6.打包

项目目录

mvn clean package -Dmaven.skip.test=true

编译成功后,去获取zip文件

将zip解压到elasticsearch ik插件目录下

查看config 是否有jdbc.yml

7.启动(切换到elasticsearch bin目录下 ./elasticsearch &)

8.观察日志

错误1

Java 安全策略导致的异常 (具体没有深究),解决方案如下:

在/home/es/目录下新建 policy.policy 写入如下内容:grant {permission java.lang.RuntimePermission "setContextClassLoader";}在elasticsearch config目录文件jvm.option添加如下代码配置上面的文件路径如下图:

错误2

继续在policy.policy 写入如下内容:

grant {permission java.lang.RuntimePermission "setContextClassLoader";permission .SocketPermission "127.0.0.1:3306","connect,resolve";};

保存继续启动观察日志

日志刷新时间和代码里配置时间一样120秒

至此 实现elasticsearch分词器词库热更新三种方案

才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以在留言区提出来,我对其加以修改。

感谢您的阅读

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。