ElasticSearch-IK拓展自定义词库(2):HTTP请求动态热词内容方式

    上一章节(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请求,再去看下分词效果

哈哈,搞定。

下一节介绍老数据热词拓展后如何索引重建。回家吃饭咯。

========================我是分割线==================

我是使用java操作es的,大家可以在扣扣群互相交流

猜你喜欢

转载自my.oschina.net/jsonyang/blog/1782832