ElasticSearch7.x IK 动态同义词/近义词动态加载同义词/近义词 dynamic_synonym

本文介绍如何安装及配置Elasticsearch的同义词插件elasticsearch-analysis-dynamic-synonym,包括手动编辑插件版本、创建更新同义词的请求接口,以及通过kibana工具创建包含动态同义词分析器的索引。

一、下载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
    }
  ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值