上一章节(https://my.oschina.net/jsonyang/blog/1643032)我们介绍了使用热词文件形式拓展词库,这样的好处是方便简单,但是如果公司运营人员来直接管理这个东西的话,让他们去操作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<String> 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请求,再去看下分词效果
  
  哈哈,搞定。
  下一节介绍老数据热词拓展后如何索引重建。回家吃饭咯。