【ElasticSearch专题】探险IK热更新的姿势二「tomcat-http更新」

本文介绍如何利用Tomcat与Elasticsearch进行远程热更新词典的方法,包括原理分析与实践步骤。通过HTTP请求监控词典更新,实现ES分词器的实时调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面分享了如何用mysql热更新文档,现在这篇用tomcat http的方式更新。

在这里插入图片描述

原理分析

上次说到他会有一个定时任务刷新,这个定时任务也会扫描http的方式拉取远程的词典,对源码做了以下分析:
监控流程:
①向词库服务器发送Head请求
②从响应中获取Last-Modify、ETags字段值,判断是否变化
③如果未变化,休眠1min,返回第①步
④如果有变化,重新加载词典
⑤休眠1min,返回第①步

public void runUnprivileged() {

		//超时设置
		RequestConfig rc = RequestConfig.custom().setConnectionRequestTimeout(10*1000)
				.setConnectTimeout(10*1000).setSocketTimeout(15*1000).build();

		HttpHead head = new HttpHead(location);
		head.setConfig(rc);

		//设置请求头
		if (last_modified != null) {
			head.setHeader("If-Modified-Since", last_modified);
		}
		if (eTags != null) {
			head.setHeader("If-None-Match", eTags);
		}

		CloseableHttpResponse response = null;
		try {

			response = httpclient.execute(head);

			//返回200 才做操作
			if(response.getStatusLine().getStatusCode()==200){

				if (((response.getLastHeader("Last-Modified")!=null) && !response.getLastHeader("Last-Modified").getValue().equalsIgnoreCase(last_modified))
						||((response.getLastHeader("ETag")!=null) && !response.getLastHeader("ETag").getValue().equalsIgnoreCase(eTags))) {

					// 远程词库有更新,需要重新加载词典,并修改last_modified,eTags
					Dictionary.getSingleton().reLoadMainDict();
					last_modified = response.getLastHeader("Last-Modified")==null?null:response.getLastHeader("Last-Modified").getValue();
					eTags = response.getLastHeader("ETag")==null?null:response.getLastHeader("ETag").getValue();
				}
			}else if (response.getStatusLine().getStatusCode()==304) {
				//没有修改,不做操作
				//noop
			}else{
				logger.info("remote_ext_dict {} return bad code {}" , location , response.getStatusLine().getStatusCode() );
			}

		} catch (Exception e) {
			logger.error("remote_ext_dict {} error!",e , location);
		}finally{
			try {
				if (response != null) {
					response.close();
				}
			} catch (IOException e) {
				logger.error(e.getMessage(), e);
			}
		}
	}

这个就是通过httpclient远程请求你在ik配置里面的配置,每次会看head和ETag是否有变化。ok,来波实操。

二、实践

准备一个tomcat8

(base) batmandeMacBook-Pro:ROOT batman$ pwd
/Users/batman/Downloads/apache-tomcat-8.5.49/webapps/ROOT
(base) batmandeMacBook-Pro:ROOT batman$ touch hot_ext.dic && touch hot_stopwords.dic
(base) batmandeMacBook-Pro:ROOT batman$ ls
RELEASE-NOTES.txt	bg-upper.png		tomcat.css
WEB-INF			favicon.ico		tomcat.gif
asf-logo-wide.svg	hot_ext.dic		tomcat.png
bg-button.png		hot_stopwords.dic	tomcat.svg
bg-middle.png		index.jsp
bg-nav.png		tomcat-power.gif
(base) batmandeMacBook-Pro:ROOT batman$

启动tomcat,可以访问hot_ext.dic文件即可

配置ik分词器

/Users/batman/Downloads/elasticsearch-6.4.3-http/plugins/elasticsearch-analysis-ik-6.4.3-http/config
(base) batmandeMacBook-Pro:config batman$ vim IKAnalyzer.cfg.xml

配置IKAnalyzer.cfg.xml,添加配置

<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://localhost:8080/hot_ext.dic</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://localhost:8080/hot_stopwords.dic</entry>

启动es,开始测试

在这里插入图片描述

修改tomcat,webapp/ROOT/hot_ext.dict文件,添加字典,查看日志
在这里插入图片描述
就这样,再次查看es分词

在这里插入图片描述

可以看到,已经加载了远程的词典。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值