开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情
在给客户做的商城的一个商品操作功能,客户提出”输入关键词iphone能搜出标题中包含apple和苹果的商品“这种类似的效果。经过一番讨论大概有两个思路,一是为每个商品在添加时同时添加一个隐形的搜索关键词类似于html中的description和keywords。二是定义同义词。两种方式都能达到要求,因为是已经上线的系统,对于第一种方案来说需要修改商品上架的功能代码,而第二种方案只是对Elasticsearch集群配置同义词功能就好了,最终决定选第二种方案。
下面就把为Elasticsearch配置支持同义词功能的步骤简要记录一下。
1、安装插件
编译插件
git clone https://gitee.com/mirrors/Dynamic-Synonym.git
cd Dynamic-Synonym
# 编辑pom.xml,修改插件版本号与ES版本号一致
mvn clean package -Dmaven.test.skip=true
安装插件
# 上传到服务器
scp elasticsearch-analysis-dynamic-synonym-7.8.0.zip root@172.16.11.100:/
Sdun#un220621!
# 上传到es容器
docker cp /elasticsearch-analysis-dynamic-synonym-7.8.0.zip 7b963a8a4fe2:/
# 进入es容器,解压插件
docker exec -it 7b963a8a4fe2 /bin/bash
cd /usr/share/elasticsearch/plugins
mkdir dynamic-synonym
cd dynamic-synonym
mv /elasticsearch-analysis-dynamic-synonym-7.8.0.zip .
unzip elasticsearch-analysis-dynamic-synonym-7.8.0.zip
# 解压后删除zip包
rm elasticsearch-analysis-dynamic-synonym-7.8.0.zip
# 重启ES
docker stop 7b963a8a4fe2
docker start 7b963a8a4fe2
2、准备web服务
通过web方式来访问同义词。能通过如下链接来访问同义词
http://127.0.0.1:8080/synonyms.txt
3、更新索引
备份索引配置
# 执行后生成一个idx_name的文件
curl --user elastic:123456 http://xxxx:port/idx_name -O
修改索引配置
复制一份idx_name 为 new.txt,并按如下格式修改
使用同义词的字段用:
"search_analyzer": "my_ik_max_word"
{
"settings": {
"analysis": {
"filter": {
"remote_syno_filter":{
"type":"dynamic_synonym",
"synonyms_path":"http://127.0.0.1:8080/synonyms.txt"
}
},
"analyzer": {
"my_ik_smart": {
"type": "custom",
"tokenizer": "ik_smart",
"filter":[
"lowercase",
"remote_syno_filter"
]
},
"my_ik_max_word": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter":[
"lowercase",
"remote_syno_filter"
]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"search_analyzer": "my_ik_max_word"
},
......
}
}
}
更新索引
# 删除索引
curl --user elastic:123456 http://xxxx:port/idx_name -XDELETE
# 创建索引
curl --user elastic:123456 http://xxxx:port/idx_name -XPUT -T new.txt