Elasticsearch同义词配置

727 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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