文章主要是介绍,通过java方式分词,并且配置远程扩展词,实现程序热更新分词
1、下载com.github.magese:ik-analyzer 版本源代码
https://github.com/magese/ik-analyzer-solr.git
2、修改文件IKanalyzer.cfg.xml
新增远程词组属性
remote_ext_dict
remote_ext_stop_dict
对应地址填写自己远程地址
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">local.dic;</entry>
<entry key="remote_ext_dict">http://ip:8080/ikanalyzer/ikanalyzer.txt</entry>
<entry key="remote_ext_stop_dict">http://ip:8080/ikanalyzer/ikanalyzer_stop.txt</entry>
<!--用户可以在这里配置自己的扩展停止词字典 -->
<entry key="ext_stopwords">stop.dic;</entry>
</properties>
注意:
IKanalyzer.cfg.xml 此配置文件,可以配置到引用分词jar包的项目里;放到resources下即可
3、修改源代码
1)Configuration.java 新增接口
List<String> getRemoteExtDictionarys();
List<String> getRemoteExtStopDictionarys();
2)DefaultConfig.java 实现接口
private static final String REMOTE_EXT_DICT = "remote_ext_dict";
private static final String REMOTE_EXT_STOP_DICT = "remote_ext_stop_dict";
@Override
public List<String> getRemoteExtDictionarys() {
List<String> extDictFiles = new ArrayList<>(2);
String extDictCfg = props.getProperty(REMOTE_EXT_DICT);
if (extDictCfg != null) {
//使用;分割多个扩展字典配置
String[] filePaths = extDictCfg.split(";");
for (String filePath : filePaths) {
if (filePath != null && !"".equals(filePath.trim())) {
extDictFiles.add(filePath.trim());
}
}
}
return extDictFiles;
}
@Override
public List<String> getRemoteExtStopDictionarys() {
List<String> extDictFiles = new ArrayList<>(2);
String extDictCfg = props.getProperty(REMOTE_EXT_STOP_DICT);
if (extDictCfg != null) {
//使用;分割多个扩展字典配置
String[] filePaths = extDictCfg.split(";");
for (String filePath : filePaths) {
if (filePath != null && !"".equals(filePath.trim())) {
extDictFiles.add(filePath.trim());
}
}
}
return extDictFiles;
}
3)Dictionary.java 新增方法
//分别在两个地方调用以下两个方法
loadMainDict 方法最后调用 loadRemoteExtDict
Dictionary 构造函数中最后调用
//自定义加载远程停用扩展词
this.loadRemoteExtStopDict();
private void loadRemoteExtDict() {
// 加载扩展词典配置
List<String> extDictFiles = cfg.getRemoteExtDictionarys();
if (extDictFiles != null) {
InputStream is;
for (String extDictName : extDictFiles) {
// 读取扩展词典文件
System.out.println("Load remote extended dictionary:" + extDictName);
try {
is = new URL(extDictName).openStream();
// 如果找不到扩展的字典,则忽略
if (is == null) {
continue;
}
try {
readDict(is, _MainDict);
} catch (IOException ioe) {
System.err.println("Extension Dictionary loading exception.");
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
System.out.println("获取文件失败:" + extDictName);
}
}
}
}
private void loadRemoteExtStopDict() {
// 加载扩展词典配置
List<String> extDictFiles = cfg.getRemoteExtStopDictionarys();
if (extDictFiles != null) {
InputStream is;
for (String extDictName : extDictFiles) {
// 读取扩展词典文件
System.out.println("Load remote stopwords dictionary:" + extDictName);
try {
is = new URL(extDictName).openStream();
// 如果找不到扩展的字典,则忽略
if (is == null) {
continue;
}
try {
readDict(is, _StopWordDict);
} catch (IOException ioe) {
System.err.println("Extension Stop word Dictionary loading exception.");
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
System.out.println("获取文件失败:" + extDictName);
}
}
}
}
4、最后程序中调用
1)pom.xml引入
<dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer</artifactId>
<version>1.0.0</version> 这里版本更具自己下载的源码修改对应的版本
</dependency>