博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch-IK拓展自定义词库(2):HTTP请求动态热词内容方式
阅读量:6496 次
发布时间:2019-06-24

本文共 2410 字,大约阅读时间需要 8 分钟。

hot3.png

    上一章节()我们介绍了使用热词文件形式拓展词库,这样的好处是方便简单,但是如果公司运营人员来直接管理这个东西的话,让他们去操作es的配置和linux系统有点难为他们了。

      IK提供了远程地址拓展词库,也就是说我们把内容做成页面,这样的话大家直接去浏览网页即可完成es的热词拓展,直接降低了管理热词的门槛。

     进入正题:

    我们首先进入es的ik插件的配置目录下

115134_H8TJ_2401293.png

编辑IKAnalyzer.cfg.xml文件

115244_tKt5_2401293.png

在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项目自己介绍的吧

120508_b25x_2401293.png

他说了两个字段任意一个即可,我维护的是eTag值。我的代码里面字段

String latest_ETags=getLatest_ETags();该值是本地的存储的字段,及时最新的etag值,当本地对es热词进行操作了然后就会修改此值,然后head请求再会把该值赋值成最新的eTag,这样在下一次请求的时候就会发现eTag值发生了变化,即es会出发get请求,现在我让项目启动起来,大家看下日志,

120859_3jbX_2401293.png

大家可以看到每分钟es就会请求一下head请求,并没有请求get请求,现在我去我的维护热词项目添加一个热词

121022_v9hB_2401293.png

121051_GRkH_2401293.png

这个词目前不是热词,我现在添加,然后截图es日志

121341_s4yo_2401293.png

触发了get请求,并且缓存值为null即代表第一次请求新的东西,所以触发了get请求,再去看下分词效果

121455_ZqDm_2401293.png

哈哈,搞定。

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

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

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

转载于:https://my.oschina.net/jsonyang/blog/1782832

你可能感兴趣的文章
C++编程思想重点笔记(上)
查看>>
【转发】什么时候该用委托,为什么要用委托,委托有什么好处
查看>>
[原]VS2012编译GLEW 1.11
查看>>
[AngularJS] Hijacking Existing HTML Attributes with Angular Directives
查看>>
关于android.view.WindowLeaked(窗体泄露)的解决方案
查看>>
微软职位内部推荐-Software Engineer II-News
查看>>
(转)I 帧和 IDR 帧的区别
查看>>
如何更快速加载你的JS页面
查看>>
解决oracle11g安装导致数据库无法自动搜集统计信息-转
查看>>
Unix_Linux系统定时器的应用(案例)
查看>>
[Java基础] Java如何实现条件编译
查看>>
【转】ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装
查看>>
设置网页标题图标
查看>>
mysql通过查看跟踪日志跟踪执行的sql语句
查看>>
Android_CodeWiki_01
查看>>
Web QQ 协议 登录加密算法 —— VC++实现
查看>>
Nutch 二次开发之parse正文内容
查看>>
代码储存
查看>>
微信公众平台对所有公众号开放自定义菜单
查看>>
Visual C++ 2012/2013的内存溢出检測工具
查看>>