Elasticsearch 使用同义词 一

elasticsearch 使用同义词

先说一下,为什么使用同义词。任何一种技术的实现,都需要为我们的使用场景服务:下面就是我将要实现功能的使用场景

需求一:要获取一个词汇的同义词。比如输入:美女   获取结果:女性 美女 妇女 女孩 等.......

需求二:要获取一个词汇的同义汇总词。比如输入:美女,妇女,女性,女孩 获取结果:女性

解析技术的信息
// 精确映射同义词,【阿迪】、【阿迪达斯】和【adidasi】的token将会转换为【Adidas】存入倒排索引中
阿迪, 阿迪达斯, adidasi => Adidas

// 对等同义词
// 当expand为true时,当出现以下任何一个token,三个token都会存入倒排索引中
// 当expand为false时,当出现以下任何一个token,第一个token也就是【Nike】会存入倒排索引中
Nike, 耐克, naike

部分信息参考:参考来源  

实现技术

ElasticSearch 5.1.1 + IK + synonym 

使用环境

安装插件

下载对应的elasticsearch-analysis-dynamic-synonym-5.1.1.zip, 解压到本地的elasticsearch/plugins目录下, 重新启动es

  • 第一种方式本地文件配置

    说明:

  • 对于本地文件:主要通过文件的修改时间戳(Modify time)来判断是否要重新加载

  • 在elasticsearch/config目录下,建立analysis目录, 并在analysis目录下放入synonym.txt, 在文件首行加入下面一行同义词,来进行测试。加入的行信息:

  •  美女,女性,女孩,妇女

    es设置索引和自定义解析器,用 kibana 执行哈

  • PUT /megacorp
    {
      "mappings": {
        "customerset": {
          "properties": {
            "name":{
              "type": "text",
              "analyzer": "ik-index",  //指定索引时候用的解析器
              "search_analyzer": "ik-smart" //指定搜索时候用的解析器
            }
          }
        }
      }
      ,
      "settings": {
        "analysis": {
          "filter": {
            "local_synonym" : {
                "type" : "dynamic_synonym",
                "synonyms_path" : "analysis/synonym.txt"  
            }
          },
          "analyzer": {
            "ik-index": {
              "type": "custom",
              "tokenizer": "ik_max_word",
              "filter": [
                  "local_synonym"   //对同义词进行了过滤
               ]
            },
            "ik-smart": {
              "type": "custom",
              "tokenizer": "ik_smart",
              "filter": [
                  "local_synonym"
               ]
            }
          }
        }
      }
    }

    设置好后,可以用以下命令查看,同义词是否配置成功。本示例均使用Kibana测试,用Postman的各位自己加域名即可

  • GET /megacorp/_analyze
    {
      "analyzer": "ik-index",
      "text": "美女"
    }

    正确分词以及同义词综合返回结果如下:截图

  • 我们要实现搜索一个词汇只返回一个词汇,加入一行配置:

  • 西红柿,番茄,土豆,马铃薯 => 土豆 ;

     

  • 注意:词库内的词,必须在分词词库中存在,下一章我会告知怎么配置

    搜索,使用如下命令:

  • GET /megacorp/_analyze
    {
      "analyzer": "ik-index",
      "text": "马铃薯"
    }

    结果:图例

  • 上面的结果有彩蛋:【;】这也是一个汇总,为什么呢:因为汇总可以是多个,且多个是以空格分割

  • 上面的一种实现方式是使用写入文本的方式,但是我们程序实际运行的时候可会动态的新增同义词,比如说:我的机器学习,能自动归纳词汇然后汇总成同义词。这个时候我们需要使用接口实现。

  • 还记得上面定义的时候我创建了一个 customerset 的mapping:这个时候我要用到了,需要大家有一定的ElasticSearch  的使用经验哈,我们开始:

  • ------------ 》》》》》》》》》》》

  • PUT /megacorp/mysynonym/10
    {
        "name" : "Z型钢"
    }
    
    PUT /megacorp/mysynonym/11
    {
        "name" : "S型钢"
    }
    
    PUT /megacorp/mysynonym/12
    {
        "name" : "H型钢"
    }
    
    PUT /megacorp/mysynonym/13
    {
        "name" : "钢轨"
    }
    

    查询语句:

  • GET /megacorp/mysynonym/_search
    {
        "query":{
          "match": {
            "name": "H型钢"
          } 
        }
    }

  • 写入文档的方式则是依靠自动匹配同义词,这个功能其实才是更好用。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值