一、本地文件读取方式
- 首先进入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=UTC
user: root
password : root
sql: 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 java.net.SocketPermission "127.0.0.1:3306","connect,resolve";
};
保存继续启动观察日志
日志刷新时间和代码里配置时间一样120秒
至此 实现elasticsearch分词器词库热更新三种方案
才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以在留言区提出来,我对其加以修改。
感谢您的阅读