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


声明:本文转载自https://my.oschina.net/jsonyang/blog/1782832,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

哈哈,搞定。

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

本文发表于2018年03月25日 22:38
(c)注:本文转载自https://my.oschina.net/jsonyang/blog/1782832,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1843 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1