IK拓展自定义词库(2):HTTP恳求动态热词内容形式
优采云 发布时间: 2020-08-22 11:16IK拓展自定义词库(2):HTTP恳求动态热词内容形式
「深度学习福利」大神带你进阶工程师,立即查看>>>
上一章节()我们介绍了使用热词文件方式拓展词库,这样的用处是便捷简单,但是假如公司营运人员来直接管理这个东西的话,让她们去操作es的配置和linux系统有点难为她们了。
IK提供了远程地址拓展词库,也就是说我们把内容弄成页面,这样的话你们直接去浏览网页即可完成es的热词拓展,直接减少了管理热词的门槛。
进入题外话:
我们首先步入es的ik插件的配置目录下
编辑IKAnalyzer.cfg.xml文件
在key为remote_ext_dict的entry标签下配置一个获取热词的恳求地址
这样es在重启后都会协程调用这个恳求,不过他的协程调用恳求方法是head,当发觉内容有变化时侯就会恳求跟你同名地址的get恳求方式上面。如果只是写了一个get恳求,他都会每次都恳求这个get恳求。
es具体如何辨识热词是否变化了,来看下我的服务器代码,我用的是java语言:
/**
* 判断热词是否发生变化方法,假如热词发生变化及要把热词更新
* @throws Exception
* @作者 arthur
* @时间 2018年3月6日 上午11:20:57
*/
@RequestMapping(value="/es/newestDict",method=RequestMethod.HEAD)
@HTTPPermission(category=PermissionCategoryID.基础访问权限)
public void headAllHotWord(HttpServletRequest request,HttpServletResponse response) throws Exception{
String latest_ETags=getLatest_ETags();
String old_ETags=request.getHeader("If-None-Match");
logger.info("head请求,old_ETags="+old_ETags);
if(latest_ETags.equals("")||!latest_ETags.equals(old_ETags)){
refreshETags();
response.setHeader("Etag", getLatest_ETags());
}
}
/**
* 获取所有的族关键词热词
* @throws Exception
* @作者 arthur
* @时间 2018年3月6日 上午11:20:57
*/
@RequestMapping(value="/es/newestDict",method=RequestMethod.GET,produces = {"text/html;charset=utf-8"})
@HTTPPermission(category=PermissionCategoryID.基础访问权限)
public String getAllectHotWord(HttpServletRequest request,HttpServletResponse response) throws Exception{
String old_ETags=request.getHeader("If-None-Match");
logger.info("get请求,old_ETags="+old_ETags);
StringBuilder hotwordStr=new StringBuilder();
//先让热词状态改为生效状态
HWIceServiceClient.getServicePrx(HotWordIPrx.class).updateHotWordIsEffect("family");
//说明第一次请求或者最新标示已经更新
List hotWord=HWIceServiceClient.getServicePrx(HotWordIPrx.class).getAllHotWords("family");
logger.info("新的热词加入,个数为: "+hotWord.size());
hotWord.forEach(str->{
hotwordStr.append(str+"\r\n");
});
refreshETags();
return hotwordStr.toString();
}
关于IK的恳求缓存机制我直接截图IK官方git项目自己介绍的吧
他说了两个数组任意一个即可,我维护的是eTag值。我的代码上面数组
String latest_ETags=getLatest_ETags();该值是本地的储存的数组,及时最新的etag值,当本地对es热词进行操作了之后才会更改此值,然后head恳求再见把该值形参成最新的eTag,这样在下一次恳求的时侯才会发觉eTag值发生了变化,即es会出发get恳求,现在我使项目启动上去,大家看下日志,
大家可以看见每分钟es都会恳求一下head恳求,并没有恳求get恳求,现在我去我的维护热词项目添加一个热词
这个词目前不是热词,我如今添加,然后截图es日志
触发了get恳求,并且缓存值为null即代表第一次恳求新的东西,所以触发了get恳求,再去看下动词疗效
哈哈,搞定。
下一节介绍老数据热词拓展后怎样索引重建。回家喝水咯。
========================我是分割线==================
我是使用java操作es的,大家可以在扣扣群相互交流