一、下载elasticsearch-analysis-dynamic-synonym
同义词插件
本人当前执行安装的是7.6.2。7.x安装方式都是一样的
github官方下载地址
如果官方地址无法打开可以点击此处
-
下载的内容是一个es插件,此插件需要自己手动编辑成自己es对应的版本(貌似当前插件版本是es7.7.0)
-
pom.xml 文件中修改 version版本号
-
在进行maven打包 mvn package
-
打包后的插件地址:elasticsearch-analysis-dynamic-synonym-master\target\releases
例如我的
-
es的插件目录下创建
dynamic-synonym
文件夹,并将此文件拷贝并解压到/elasticsearch/plugins/dynamic-synonym目录下 -
重启es即可
二、创建请求接口
可以查看源码文件 RemoteSynonymFile.isNeedReloadSynonymMap()
接口返回200并且header中“Last-Modified”与“ETag”发生改变才会更新同义词
@RequestMapping("/synonym")
public String synonym (HttpServletRequest request, HttpServletResponse response) {
String result = "";
String eTag = request.getHeader("If-None-Match");
String modified = request.getHeader("If-Modified-Since");
String currentDate = DateUtil.formateDate(new Date(), "yyyyMMdd");
log.info("加载ik同义词,上次同义词:{},上次修改时间:{},当前日期:{},redisKey={}",eTag,modified,currentDate,redisKey);
if(!currentDate.equals(modified)) {
String oldSynonym = synonymService.count()+ "";
log.info("加载ik同义词,当前同义词数:{}",oldSynonym);
if(!oldSynonym.equals(eTag)) {
// 获取数据库同义词
List<Synonym> all = synonymService.all();
StringBuilder words = new StringBuilder();
for (Synonym synonym : all) {
// 可以使用“=>”方式或者直接“,”分割形式,自行考虑应用场景
String theWord = StringUtils.join(synonym.getWords()," => ",synonym.getSynonymWords());
words.append(theWord);
words.append("\n");
}
eTag = oldSynonym;
modified = currentDate;
result = words.toString();
}
}
//更新时间
response.setHeader("Last-Modified", modified);
response.setHeader("ETag", eTag);
response.setHeader("Content-Type", "text/plain");
return result;
}
三、创建索引测试
配置说明:
- type:dynamic_synonym或dynamic_synonym_graph 必须
- synonyms_path:与弹性配置文件或URL相关的文件路径,必须
- interval:刷新同义词文件的秒间隔,默认值:60,可选
- ignore_case:忽略同义词文件中的大小写,默认值:false,可选
- expand:展开,默认:true,可选
- lenient:导入同义词时对异常抛出的宽大处理,默认值:false,可选
- format:同义词文件格式,默认:“”,可选。对于WordNet结构,可以将其设置为“WordNet”
更新机制
- 本地文件:由文件的修改时间决定,如果它已经改变了同义词wil
- 远程文件:读取http header中Last-Modified 和 ETag 。如果其中一个发生了更改,则将重新加载同义词。
- 注意:文件编码应该是utf-8文本文件。
kibana工具创建索引
PUT demo
{
"aliases" : {
},
"mappings" : {
"properties" : {
"article" : {
"type" : "text",
"analyzer" : "ik_max_custom",
"search_analyzer" : "ik_smart"
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "1",
"max_result_window" : "500000",
"analysis" : {
"filter" : {
"limit_len" : {
"type" : "length",
"min" : "1"
},
"my_synonym": {
"type": "dynamic_synonym",
"synonyms_path":"http://localhost/synonym",
"interval": 30
}
},
"analyzer" : {
"ik_max_custom" : {
"filter" : [
"limit_len"
],
"char_filter" : [
"html_strip"
],
"tokenizer" : "ik_max_word"
},
"ik_smart": {
"type": "custom",
"tokenizer": "ik_smart",
"char_filter": [],
"filter": [
"my_synonym"
]
}
}
},
"number_of_replicas" : "1"
}
}
}
- 如同义词
- 同义词方式:房屋,房地产 => 房屋,房地产
GET demo/_analyze
{"analyzer" : "ik_smart", "text" : "房屋"}
结果:
{
"tokens" : [
{
"token" : "房屋",
"start_offset" : 0,
"end_offset" : 3,
"type" : "SYNONYM",
"position" : 0
},
{
"token" : "房地产",
"start_offset" : 0,
"end_offset" : 3,
"type" : "SYNONYM",
"position" : 0
}
]
}