您的位置:首页 > 理论基础 > 计算机网络

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

2018-03-25 00:00 113 查看
摘要: 拓展词库章节分三篇文章介绍
1:手动添加热词文件方式
2:配置http请求,动态热词形式
3:热词更新后,如何索引重建

上一章节(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的,大家可以在扣扣群互相交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息