最近公司业务需求用到了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动态热词更新基本完成。剩下的就是功能优化了。。。 。。。
----华丽得分割线----
附上小弟久违得订阅号,路过的大佬不嫌弃点个关注