第一步下载 elasticsearch-analysis-ik
https://github.com/medcl/elasticsearch-analysis-ik/releases 一定要选择跟自己安装的版本一样的.
第二步 解压
在es的安装目录plugins下新建文件夹ik将分词器加压到这个目录
第三步 启动es
查看分词效果
自定义扩展词 停用词
找到IKAnalyzer.cfg.xml 查看内容如下
<?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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
key=ext_dict 的扩展词典的内容是es启动的时候就去加载,而且只加载一次,从新添加的扩展词要重启es才会有效果
key=remote_ext_dict 的扩展词的内容是远程调用的,es每隔60通过http请求远程服务获取到数据,加载到自己内存中,这个是动态的添加,实时有效,不需要重新启动es(这个可以和tomcat搭配使用);
ext_dict
做如下修改
<!--可以定义多个文件用英文分号分开 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
在IKAnalyzer.cfg.xml 同级的目录下面创建文件ext_dict.dic ext_stopwords.dic 添加我们词语
重新启动es可查看效果.
remote_ext_dict
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://localhost:8080/tag.dic</entry>
这添加的是一个http请求的连接.
tag.dic文件是放在tomcat webapps\ROOT 下面
IK 源码分析
**
// 单线程的任务执行器 每隔固定时间去执行一次
private static ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
/**
* 词典初始化 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
* 只有当Dictionary类被实际调用时,才会开始载入词典, 这将延长首次分词操作的时间 该方法提供了一个在应用加载阶段就初始化字典的手段
*
* @return Dictionary
*/
public static synchronized void initial(Configuration cfg) {
if (singleton == null) {
synchronized (Dictionary.class) {
if (singleton == null) {
singleton = new Dictionary(cfg);
singleton.loadMainDict();
singleton.loadSurnameDict();
singleton.loadQuantifierDict();
singleton.loadSuffixDict();
singleton.loadPrepDict();
singleton.loadStopWordDict();
if(cfg.isEnableRemoteDict()){
// 建立监控线程 获取远程扩展词
for (String location : singleton.getRemoteExtDictionarys()) {
// 10 秒是初始延迟可以修改的 60是间隔时间 单位秒
pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
}
for (String location : singleton.getRemoteExtStopWordDictionarys()) {
pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);
}
}
}
}
}
}