IK拓展自定义词库(2):HTTP恳求动态热词内容形式

优采云 发布时间: 2020-08-22 11:16

  IK拓展自定义词库(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的,大家可以在扣扣群相互交流

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线