IKAnalyzer如何自定义远端词库
IKAnalyzer1.3.4要自定义我们自己的词库,而且我们可以随时新增分词,网上查了一圈没有相关资料,看来只有自己搞定了。这里大家需要熟悉HTTP协议中的Last-Modified、ETags这些概念,这样能更容易理解IKAnalyzer作者的设计思路。
观察了下IKAnalyzer分词器的配置文件IKAnalyzer.cfg.xml发现其中有这样一个选项:
<!--用户可以在这里配置远程扩展字典 --><entry key="remote_ext_dict"><entry>,而且作者做了注释说这个就是扩展远程词典的。于是打开IKAnalyzer的源码查看,最后在Dictronary这类下找到这个方法:getRemoteWords。经过查看发现其实用的是HttpClient去获取分词。于是我就用SpringMVC写了个Controller来解决。这里要注意:每个分词之间要使用换行符即“\r\n”来分割,貌似问题圆满解决,
可是,我发现IKAnalyzer的这个获取分词的动作只是在启动的时候去访问我写的Controller。很显然这是不行的,这就违背了我随时新增分词的愿望了,看来我要扩展这个分词器了。于是我开始从头翻这个开源分词器的源码,我在Dictronary最后找到以下的代码,顿时让我眼前一亮:
public void reLoadMainDict(){
logger.info("重新加载词典...");
loadMainDict();
loadStopWordDict();
}
顾名思义,这个是重载分词的。于是我问自己,什么时候重载?如何重载?于是我搜了下,最后再Monitor这个类下找到run这个方法,这是Monitor实现Runnable接口的,在这个方法里这个分词器先去构造httphead,并且带上If-None-Match、If-Modified-Since这俩参数去访问Controller(关于这俩参数的概念,大家可以上网查),然后根据返回来的response的head里的Last-Modified和ETags来和Monitor缓存的变量进行比较,如果任何一个不相同就需要重新访问Controller中去获取数据,说到这里可以总下:可以在服务端(Controller)中设置这俩变量,来控制IKAnalyzer是否重新加载分词。OK,分析到这里问题解决了。最后我写的Controller中代码大概如下:
/**
* 获取分词
* @return
*/
@RequestMapping("getDict")
@ResponseBody
public String getDict(HttpServletRequest request, HttpServletResponse response) {
String result = "";
StringBuilder sb = new StringBuilder();
List<Word> wordList = wordService.selectAllWord();//获取所有分词,这里可以改进使用缓存等。
String eTag = request.getHeader("If-None-Match");
Long modified= request.getDateHeader("If-Modified-Since");
//设置头
if(null == modified || -1 == modified) {
//如果没有,则使用当前时间
modified = System.currentTimeMillis();
}
/ /设置头信息。
String oldEtag = wordList.size() + "";
response.setDateHeader("Last-Modified", Long.valueOf(modified));
response.setHeader("ETags", wordList.size() + "");
if(!oldEtag.equals(eTag)) {
//拼装结果
for(Word tempWord : wordList) {
//分词之间以换行符连接
if(StringUtils.isNotEmpty(sb.toString())) {
sb.append("\r\n");
}
sb.append(tempWord.getValue());
}
result = sb.toString();
//更新时间
response.setDateHeader("Last-Modified", System.currentTimeMillis());
}
return result;
}
这里还可以再优化,这是后话了,有了这个思路其余的都是锦上添花。
IKAnalyzer如何自定义远端词库相关推荐
- es自建搜索词库_【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库...
接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze { "analyz ...
- 2022还在使用Mysql进行数据检索?ElasticSearch自定义扩展词库完成检索
文章目录 1.为什么要自定义扩展ES词库呢? 2.如何自定义扩展词库呢? 3.Docker安装Nginx 4.在nginx中保存一个简易词库 5.修改IK分词器的配置文件,让其指向nginx保存的词库 ...
- 【ES从入门到实战】二十三、全文检索-ElasticSearch-分词-自定义扩展词库
接第22节 3).自定义词库 ik 分词器默认的分词并不能满足我们的需求,对于一些新的网络用语,ik 分词器就会无法准确的进行分词识别,比如: POST _analyze {"analyze ...
- 架构师成长记_第八周_11_ES- ik中文分词器与自定义中文词库
文章目录 ik中文分词器 1. 安装ik中文分词器(7.4.2版本) 2. 使用ik中文分词器 2.1 分词器: ik_max_word 2.1 分词器: ik_smart 自定义中文词库 自定义词库 ...
- ES进阶(6)-自定义扩展词库
在实际分词中有些分词并不能出现我们预期的分词结果,因此我们可以使用自定义词库 1.安装nginx 在mydata下创建目录 mkdir nginx 启动实例 docker run -p 80:80 - ...
- ibus自定义颜文字词库
安装ibus-pinyin: 问题1:Ubuntu系统选择自带的拼音输入法是错误的,它默认无法输入中文及中文词组,请独立安装其他基于IBus的输入法 用PPA的第三方源将IBus升级的方法: 在终端输 ...
- Elasticsearch--分词-自定义扩展词库---全文检索引擎ElasticSearch工作笔记022
然后我们再看,之前我们给"尚硅谷电商项目" 进行分词的时候 可以看到,我们知道尚硅谷是一个词,但是他没有给我们识别出来,而是,把尚分离了出来. 那怎么让他按照我们想的进行分词呢?, ...
- 谷粒商城ES自定义词库(十八)
具体的IK分词可以查看博客:https://www.cnblogs.com/dalianpai/p/12694298.html 122.全文检索-ElasticSearch-分词-分词&安装i ...
- ElasticSearch自定义词库
由于网络词语层出不穷,ik分词器有时并不能完全识别网络词汇,如下: 按照网络词语,王者荣耀应该被识别为一个词语,而不是被拆分成2个. 所以这时需要自定义词库来解决以上问题. 自定义词库 自定义扩展词库 ...
最新文章
- 译 | 缓存穿透问题导致Facebook史上最严重事故之一
- python3下载慢-PIP 下载慢,给你Python3的pip换个源 一键换源
- UC伯克利博士尤洋回国创业,曾破ImageNet纪录!已获超千万融资
- node.js第一步
- TechEd2007现场侧记:TechEd的变与不变
- ImportError: cannot import name FileStorage
- 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
- 新一代数据库技术在双11中的黑科技
- 扫一扫闪退的可能性之一[wex5开发]
- 使用CocoaPods给微信集成SDK打印收发消息
- 解决jQuery聚焦时光标在input最前面的问题
- PHP双码率视频云转码服务系统源码 m3u8切片秒切html5播放器 全开源
- Liver Writer打开以前的日志/页面
- mysql regexp边界_MySQL中REGEXP正则表达式使用大全
- java.lang.UnsupportedOperationException: This parser does not support specification “null“ version “
- java中ejb项目_创建EJB项目
- J2EE快速入门之集合框架【01】
- 如何开发一款棋牌游戏?棋牌游戏平台搭建
- springboot入门-idea
- Uniapp消息推送配置各个厂商UniPush