Elasticsearch之自定义同义词开发实践

1.什么是同义词查询

ES(Elasticsearch)作为一个开源的、高扩展的分布式全文检索引擎,具有近实时的索引、搜索和分析等优点。用户在使用ES时,主要青睐其快速的查询性能。不同于传统的数据库,它具有非常灵活的查询方式,不但支持精确查询、模糊匹配、聚合查询等传统的数据查询方式,而且支持同义词查询。同义词查询,顾名思义就是根据相同意思的词进行查询,比如数据库里面存储的数据为“马铃薯”,我们不仅可以通过关键字“马铃薯”匹配到该数据,还可以通过关键字“土豆”得到我们想要的数据(“马铃薯”),该功能可以让查询更加的全面、方便和快捷,可以让用户体会到“随心所欲”般的查询快感,迫不及待的小伙伴赶快行动起来吧。

2.同义词查询解决了什么问题

同义词查询可以根据同义或近义词进行查询,它的使用主要针对以下两种应用场景:

  1. 获取一个词汇的同义词,比如搜索:京东,获取的结果:京东,淘宝,拼多多……。
  2. 获取一个词汇的同义词汇总,比如搜索:京东、淘宝或者拼多多,获取结果:电商平台。

对于场景一,如果不使用同义词查询,可能会有查询条件太苛刻,以及查询结果不全面等问题。例如某银行推出的有京东联名信用卡,在业务搜索关键字“京东”的时候,业务人员更想看到与京东联名卡相关的信息,所以仅仅返回京东相关的数据是不全面的,使用同义词搜索可以返回京东及京东联名卡的所有数据,这样可以更加全面得到我们想要的数据。

对于场景二,如果不使用同义词查询,可能需要存储更多的数据,浪费存储空间。例如某些项目仅仅需要电商平台的一些公共数据,而在搜索时,我们搜索不同的电商平台就需要存储不同电商平台的数据,造成存储浪费,使用同义词查询仅需要存储一份数据,搜索不同电商平台会得到同一个结果,可以更加准确、方便的得到我们需要的数据,使得查询条件更加宽泛。

ES集群在同义词配置时,传统模式是在analysis文件夹下面创建一个synonym文件,当用户创建索引时,指定同义词文档地址,搜索时会自动加载本地文件。传统模式为离线模式,需要在每个ES节点上面都配置一份一模一样的synonym文件,且每次进行更改或追加操作时,需要重启集群才能生效,这对于大数据平台来说是不符合实际的。为了实现同义词的热加载,我们开发了同义词服务器,只需把同义词文档synonym放在服务器上一份即可,每次更改或追加操作都会在自己设置的时间间隔之后生效,这样不但使集群使用者使用更加方便,而且对于集群维护人员也极大的减少了工作量,提高了集群的可用性。

3. ES同义词查询原理

ES同义词查询基于ES的分词原理,ES的分词原理可以查看之前的文章:让搜索引擎更懂你-Elasticsearch自定义分词开发实践,本文不再赘述,这里仅对ES同义词查询的原理进行介绍。

  

数据index到ES集群的过程依次为字符过滤器(Character filter)、分词器(Tokenizer)和Token过滤器(Token filter)。一个Analyzer可以包括多个Character filter、一个Tokenizer和多个Token filter,Character filter 用于分词前对原搜索的句子进行处理, Tokenizer 用于将搜索的句子分成多个词组,Token filter 用于处理Tokenizer输出的词组,比如删除某些词,修改某些词,增加某些词。

同义词查询的关键是自定义Token filter。该filter在收到Tokenizer发来的数据时,首先会获取synonym文件,比对Tokenizer处理后的词组,当出现同义词时,就按照synonym文件规则选定待搜索的词组,进行同义词搜索。ES在创建索引时进行预

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值