背景
項目有需要做一個同義詞搜索的功能,就去研究了下es的同義詞搜索功能,踩了不少坑記錄下
同義詞本地文件讀取方式
如果只是需要同義詞搜索,不需要管理和更新,es本體就能支持,我踩的坑基本也不在這,就不具體說了,參考這個就好了https://blog.csdn.net/qq_40592041/article/details/108006994
使用(dynamic-synonym)插件遠程熱詞更新
拉取倉庫代碼
插件倉庫地址https://github.com/bells/elasticsearch-analysis-dynamic-synonym
gitee有克隆的倉庫,github連不上可以去gitee找找
根據(jù)自己的es版本打包
查詢es版本直接請求es ip+端口就行
http://127.0.0.1:9200/
返回的json version里面就是版本
{
"name" : "e8d7d490ec4f",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Hf1KFT2bSnaW00s9eLSK4Q",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
找到pom文件修改version版本和es版本一致
這個時候有個問題,部分版本回出現(xiàn)打包失敗的問題,第一種解決方案是去git提交歷史里找最接近的版本,比如我是7.4.2版本,我找的就是支持7.7.0的提交記錄,回滾代碼到對應(yīng)記錄,在改version為7.4.2打包
打包后運行發(fā)現(xiàn)還是有問題,會報NoSuchMethodError,說output不存在,于是我把git記錄往后推,到了改版本前,這個時候打包也會報output找不到的問題,這個時候把代碼里報錯的outputs(),改成outputs,不是調(diào)方法,而是掉對象,在打包就行了
打完包后在\target\releases文件夾中有個壓縮包,解壓上傳到es的plugins文件夾里新建的dynamic-synonym文件夾就行
然后重啟es,我這邊是docker部署的,直接docker restart就行
服務(wù)端代碼
我這邊為了測試是給的死數(shù)據(jù),后續(xù)需要按需修改,一開始我以為只要有放回就行,后來發(fā)現(xiàn)還需要對head做處理才行
@GetMapping("/getActive")
public String getActiveEsSynonyms(HttpServletRequest request, HttpServletResponse response) {
String result = "";
String eTag = request.getHeader("If-None-Match");
String modified = request.getHeader("If-Modified-Since");
String currentDate = DateUtils.getTime();
System.out.println("加載ik同義詞,上次同義詞:" + eTag + ",上次修改時間:" + modified + ",當前日期:" + currentDate);
// if (!currentDate.equals(modified)) {
String oldSynonym = 2+"";
// System.out.println("加載ik同義詞,當前同義詞數(shù):"+2);
// if (!oldSynonym.equals(eTag)) {
// 獲取數(shù)據(jù)庫同義詞
// List<Synonym> all = synonymService.all();
// StringBuilder words = new StringBuilder();
// for (Synonym synonym : all) {
// // 可以使用“=>”方式或者直接“,”分割形式,自行考慮應(yīng)用場景
// String theWord = StringUtils.join(synonym.getWords(), " => ", synonym.getSynonymWords());
// words.append(theWord);
// words.append("\n");
// }
eTag = oldSynonym;
modified = currentDate;
result = "蘋果,手機\nns,游戲機";
// }
// }
//更新時間
response.setHeader("Last-Modified", modified);
response.setHeader("ETag", eTag);
response.setHeader("Content-Type", "text/plain");
return result;
}
設(shè)置es索引
如果是新建索引直接新建就好
PUT test
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "1",
"max_result_window": "200000",
"analysis": {
"filter": {
"remote_synonym": {
"type": "dynamic_synonym",
"synonyms_path": "http://ip:port/synonyms/getActive",
"interval": 30
},
"local_synonym": {
"type": "dynamic_synonym",
"synonyms_path": "synonym.txt"
}
},
"analyzer": {
"ik_max_syno": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": [
"remote_synonym"
]
}
}
}
}
},
"mappings": {
"properties": {
"keyword": {
"type": "text",
"analyzer": "ik_max_syno"
}
}
}
}
如果是已有索引要修改,我的操作是先新建一個結(jié)構(gòu)一樣的索引,在把數(shù)據(jù)復(fù)制過去,在刪除原索引,新建原索引,數(shù)據(jù)復(fù)制回去,刪除新索引
刪除索引命令
DELETE test
數(shù)據(jù)復(fù)制命令文章來源:http://www.zghlxwxcb.cn/news/detail-825921.html
POST _reindex
{
"source": {
"index": "原索引"
},
"dest": {
"index": "目標索引"
}
}
測試
添加數(shù)據(jù)后測試,搜索蘋果能出現(xiàn)手機就說明沒問題了文章來源地址http://www.zghlxwxcb.cn/news/detail-825921.html
到了這里,關(guān)于elasticsearch 同義詞管理熱更新的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!