ElasticSearch配合mysql实现同义词热更新
第一次写博客,elasticsearch网上的资料实在太少了,在网上翻了很多资料,自己在做的时候,由于版本原因,插件集成出现了很多问题,在这里我总结一下,希望对大家有帮助,谢谢支持
使用环境
elasticsearch6.1.2
mysql
同义词插件6.1.4 同义词插件下载地址
安装插件
地址: https://github.com/bells/elasticsearch-analysis-dynamic-synonym
*下载插件时,必须选择比较接近的版本下载,版本相差太多,集成插件会出现不兼容问题
比如我使用的版本为6.1.2,我下载的是6.1.4版本的
作者提供的插件包版本比较少,要想获得对应的插件包,则需要自己编译
编译说明
1.打开plugin/DynamicSynonymPlugin.java将第40行 @Override 注释掉即可
vim /elasticsearch-analysis-dynamic-synonym-master/src/main/java/com/bellszhu/elasticsearch/plugin/DynamicSynonymPlugin.java
2.修改pom.xml文件,将6.1.4全部修改为6.1.2
3.最后切换到elasticsearch-analysis-dynamic-synonym-master目录,执行mvn clean package编译打包
*如果没安装maven环境,则需要先安装,并且使用阿里云国内镜像
http://blog.csdn.net/fenglailea/article/details/53304479
编译成功之后: 编译成功后文件位置:elasticsearch-analysis-dynamic-synonym-master/target/releases/elasticsearch-analysis-dynamic-synonym-6.1.2.zip
4.将插件包移动到 mv /elasticsearch-6.1.2/plugins/dynamic-synonym 进行解压,并重启es
插件支持两种方式,远程静态文件和远程访问接口
远程访问接口
注意:
1.在数据库中创建同义词表
2.编写查询同义词接口
说明:
* 这个http请求需要返回两个头部,一个是 Last-Modified,一个是 ETag,只要有一个发生变化,该插件就会去获取新的同义词来更新相应的同义词。
只要 PHP 返回的 ETAG 是 weak ETAG,那么就一切都会正常起来了。而所谓的 weak ETAG,也就是弱 ETAG,它是相对于正常 ETAG 而言的,表现形式就是 ETAG 前面加上 W/注:nginx 在开启了 gzip 之后,如果有 ETAG 则会调用 ngx_http_clear_etag 将其清除,解决的办法很简单:
W/“db8b38e8a3257a2f195b727eceb2c5d3”
/*
* 查询跟踪任务列表
* */
@RequestMapping(value = "/synonym",produces="application/json;charset=utf-8")
@ResponseBody
public String list(HttpServletResponse response,
HttpServletRequest request) {
List<String> s = sysSynonymService.selectAllSysSynonym();
//查询最大更新时间
Date updateDate = sysSynonymService.selectMaxUpdateTime();
response.setHeader("ETag" ,s.size() + "" );
response.setHeader("Last-Modified" ,updateDate.getTime() + "" );
//response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;charset=UTF-8");
String result = "";
for (String s1 : s) {
result += s1+"\n";
}
return result;
}
接口返回的数据格式如下
同义词设置
{\n" +
" \"settings\" : {\n" +
" \"analysis\" : {\n" +
" \"analyzer\" : {\n" +
" \"synonym\" : {\n" +
" \"tokenizer\" : \"ik_max_word\",\n" +
" \"filter\" : [\"remote_synonym\"]\n" +
" }\n" +
" },\n" +
" \"filter\" : {\n" +
" \"remote_synonym\" : {\n" +
" \"type\" : \"dynamic_synonym\",\n" +
" \"synonyms_path\" : \"http://127.0.0.1:8080/ht/easybiiweb/synonym/synonym\",\n" +
" \"interval\": 60\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}
注意:在调用接口时,很有可能会报一下错误
解决方法http://blog.yourtion.com/java-access-denied-socketpermission-solution.html