elasticsearch 修改IK分词器源码 mysql热词动态更新踩坑记

最近公司业务需求用到了elasticsearch 。由于是内部使用,好多检索词语不确定,需要自定义好多热词,为了方便添加热词而又不必频繁重启es所以想动态更新以满足需求。

版本:

elasticsearch 6.5.2

mysql 5.6

jdk1.8

话不多说,IK源码添加mysql修改参考https://blog.csdn.net/wuzhiwei549/article/details/80451302简单粗暴,不过再使用过程中遇到了几个坑,在这里记录一下。

首先,代码改完部署后会报java.sql.SQLException: No suitable driver found for jdbc:mysql的错误。

后来发现在文章 https://blog.csdn.net/wuzhiwei549/article/details/80451302中创建mysql链接时没有加载驱动(主要是身为搬运工的我太懒了,都没仔细看代码拿过来就用。各位老铁可不要学我啊)

在创建mysql链接时动态加载mysql驱动 Class.forName("com.mysql.jdbc.Driver");

private void loadMySQLExtDict() {
   Connection conn = null;
   Statement stmt = null;
   ResultSet rs = null;

   try {
      Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");
      props.load(new FileInputStream(file.toFile()));

      logger.info("[==========]jdbc-reload.properties");
      for(Object key : props.keySet()) {
         logger.info("[==========]" + key + "=" + props.getProperty(String.valueOf(key)));
      }

      logger.info("[==========]query hot dict from mysql, " + props.getProperty("jdbc.reload.sql") + "......");
      Class.forName("com.mysql.jdbc.Driver");
      conn = DriverManager.getConnection(
            props.getProperty("jdbc.url"),
            props.getProperty("jdbc.user"),
            props.getProperty("jdbc.password"));
      stmt = conn.createStatement();
      rs = stmt.executeQuery(props.getProperty("jdbc.reload.sql"));
      while(rs.next()) {
         String theWord = rs.getString("word");
         logger.info("[==========]hot word from mysql: " + theWord);
         String value = StringUtils.trimWhitespace(theWord);
         if(value != null && !"".equals(value)){
            _MainDict.fillSegment(theWord.trim().toCharArray());
         }
      }
      Thread.sleep(Integer.valueOf(String.valueOf(props.get("jdbc.reload.interval"))));
   } catch (Exception e) {
      logger.error("erorr", e);
   } finally {
      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);
         }
      }
   }
}

这里改完之后再次部署,会报java.sql.SQLNonTransientConnectionException: Could not create connection to database server.

java.net.SocketException: Permission denied 。

这里修改java安全策略文件java.policy。

java.policy在你的 /jre/lib/security 目录下

需要打开什么权限就自己添加就可以了。

java.policy修改参考链接:https://www.cnblogs.com/dongzhiquan/archive/2010/09/26/1994546.html

到此为止,es重新启动运行正常。IK分词器mysql动态热词更新基本完成。剩下的就是功能优化了。。。 。。。

----华丽得分割线----

附上小弟久违得订阅号,路过的大佬不嫌弃点个关注

 

你可能感兴趣的:(elasticsearch,elasticsearch)