Elasticsearch同义词最佳实践

这篇具有很好参考价值的文章主要介绍了Elasticsearch同义词最佳实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        毫无疑问,使用同义词是搜索工程师工具箱中最重要的技巧之一。尽管新手有时会低估同义词的重要性,但几乎所有搜索系统都离不开它。与此同时,人们有时仍会低估与使用同义词相关的一些复杂情况和微妙情形,甚至高级用户也不例外。

        用好同义词库,在搜索的过程中,在提升召回率上,有着奇迹般的力量。

        最近正在做同义词库的工作,在提升召回效果方面,确实有很大的贡献。本篇文章中,将会详细讲解如何使用,其中的坑,以及各种玩法的最佳实践。本篇博文还会回答一些有关同义词使用方法的常见问题,并指出一些经常需要注意的相关事项。

同义词库使用需求

  1. 提升召回率。提升召回效果。
  2. 词库热更新需求。

前言、为什么要使用同义词

这里引用官方博文的描述。

为帮助大家理解同义词的巨大作用和灵活性,我们来快速看一下当今大多数搜索引擎的内在工作原理。搜索引擎会对文档和查询进行分析并将其拆解为最小的单元(通常称为词元,实际上就是抽象的符号)。搜索时,匹配过程会使用简单字串相似度,所以如果查询中有一些十分微小的拼写错误(例如“hous”,只比“house”少一个字母 e)或者使用名词的复数形式(“houses”),即使文档中包含名词的单数形式(“house”),搜索引擎也不会匹配到这份文档。词干提取器或模糊查询等工具虽然可以解决一些最常见的此类问题,但是它们并不能消除相关联的概念或想法之间的差异,也不能将文档或查询中稍有不同的单词用法视为等同。 这时同义词就派上了大用场。同义词的英文 synonym 来自于希腊语,分别是前缀 σύν(syn,表示“一起”)和 ὄνομα(ónoma,表示“名称”)。从它的词源可以看出,同义词表示的是在同一语言或领域中具有完全或基本相同意思的不同词语。实际上,同义词的范围非常广泛,包括一般同义词(“疲劳”和“困倦”)、缩写(英镑的两种写法“lb.”和“pound”)、电商搜索中产品的不同拼写(“iPod”和“i-Pod”)、细微的语言差异(例如均表示电梯的英式英语“lift”和美式英语“elevator”)、专业用词和普通用词(例如“犬”和“狗”),甚至单纯表示同一概念的两种方式(“宇宙”和“太空”)。通过提供恰当的同义词规则,搜索工程师能够就哪些词在各自领域内具有相似意思并应该采取相似处理方法提供相关信息。 对搜索引擎而言,至为重要的是知道文档中的哪个字词与查询内容相匹配,即使它们可能看起来并不一样。由于这涉及到十分具体的领域知识,所以用户需要提供恰当的规则。同义词筛选器可在定制分析器中使用,其能够基于用户定义的规则替换或添加其他词元,既可在索引时进行以便在索引后的文档中同时存储这些内容(例如词语的两种变体),也可在索引时进行以扩展搜索词并匹配到更多相关文档。我们稍后会讨论这两种方法的优缺点。

官方的描述,总是很晦涩。其实很简单,就是要解决我在本文开头写的两个需求点。

一、关于同义词最佳实践问题

  1. 如何用好同义词?

关于这个问题,其实应该清楚它的工作原理。这里举个例子,一篇文章中,用来描述被包围了,可以用八方受敌,也可以用四面楚歌来描述。再结合ES的内部存储原理,我们可以选择在索引阶段,在文章中遇到八方来敌的时候,会在倒排表中添加八方来敌和四面楚歌这两个词,文档id指向同一个。这个过程是同义词在索引阶段生效。

但是在索引阶段生效,有很大的弊端。

  • 由于必须对所有同义词进行索引,所以索引规模会变大。整体存储空间增加一倍甚至是几倍。这在超大规模的集群中使用,绝对是无法接受的。想想300个节点的集群,增加一倍或者两倍,老板绝对不会同意
  • 搜索得分(依赖于字词统计数据)可能会受影响,因为同义词也会计算在内,所以不常见单词的统计数据会存在偏差。这里和BM25相关性分数有关,以为词频会发生很大的变化。
  • 同义词库无法动态更新,除非进行重新索引,否则无法针对既有文档更改同义词规则。在超大规模的集群中,更新一下词库,重跑一遍数据,绝对不是一天两天能完成的,动辄上月。

同义词还可以在搜索阶段生效。这可以完美的解决以上在索引阶段生效的三个致命 的问题。其工作原理,理解起来也很容易,就是在搜索阶段中的分词的时候,匹配一下同 义词。例如一次搜索中搜了八方受敌,但是,实际上逻辑是这样的 (八方受敌 OR 四面 楚歌)。同样,这样做也是有代价的。它无法很大的应对超多关键词的检索。假如你的一 次搜索 100个关键词。经过同义词以后,有可能变成 200个甚至更多关键词。

  • 检索过程中的性能损失。如果本身检索的关键词不多,那影响微乎其微。假如本来检索关键词就很多,又开启同义词,性能损失绝对会在一倍以上!!!即使是这样,在搜索阶段使用同义词,也远好于在索引阶段使用同义词。
  • 检索关键词变多。检索的过程中,花费的资源也会更多。这点主要体现在CPU上。

但是在搜索阶段使用同义词。它是能够解决同义词库更新的需求的。统一词库可以随 时变动。而这个更新成本,并不大。对于7.3版本以后的ES来说,仅仅是触发一次reloadApi的事情。

POST my_index/_reload_search_analyzers

返回信息如下:

{
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "reload_details" : [
    {
      "index" : "my_index",
      "reloaded_analyzers" : [
        "synonym_analyzer" # 这里是我定义的带有同义词的分词器。
      ],
      "reloaded_node_ids" : [
        "jiIC9zJyTES_dMIw0w6n8A",
        "dMKuVhnvQySXkO7AfZCXrA",
        "_6o86PMrRlegvJfB_G8bTw"
      ]
    }
  ]
}
    1. 同义词库的格式问题

ES中,同义词库可以有不同的格式。这里也有很多妙用!我举三个例子

  • eg1 :上班 => 工作 干活
  • eg2 :高兴,快乐,娱乐,兴奋
  • eg3 : 工作 干活 => 上班

其中eg1,他的意思是,把上班,映射成两个词。假如你搜索上班,经过分词器以后,就变成了搜索 工作和干活。这样适合在搜索阶段使用。可以提升召回的数量和质量。

其中eg2,它的意思是,遇到高兴的时候,会分词器会解析成,高兴,快乐,娱乐,兴奋这四个词,同样真正的搜索也是用这四个词去搜索的。这样适合在搜索阶段使用。可以提升召回的数量和质量。

其中eg3,它的意思是,把工作和干活映射成上班。这样的可以应用在索引阶段。其实可以巧妙的帮业务去解决归一化的问题。假如中国,cn,zh,chaina,中华人民共和国,都想映射成中国,做标准化的数据,在检索阶段是可以提速的。同样在索引阶段也是可以节省倒排链的长度的。

二、实战

实际操作一下。

  1. 是否使用插件?

同义词其实是ES本身就有的能力。同义词插件,通常是用来做热更新的,或者是用来把词库放在远端(例如Nginx)。其实本质上是解决更新问题的。假如说你的集群有几百个节点,用本地词库,每次更新词库要更新几百个节点,这操作起来多少有点麻烦。

  1. 如何使用同义词?

在es里边其实使用的是filter,添加一个filter即可,并把这个filte在分词器中绑定。

Synonym token filter | Elasticsearch Guide [7.11] | Elastic

我这里只提几个点。

PUT /test_index
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "synonym": {
            "tokenizer": "whitespace",
            # 这里引用了同义词的filter
            "filter": [ "synonym" ]
          }
        },
        "filter": {
          "synonym": {
            "type": "synonym",
            # 注意这里,analysis一个目录,它是在es解压后的config下的目录。synonym.txt 是同义词库。具体文件,下边会给。
            "synonyms_path": "analysis/synonym.txt",
            # 这个参数,可以忽略同义词库中分词有问题的错误行。
             "lenient": true,
            # 这个参数很重要,只有开其他,才能实现同义词库的热更新。
            "updateable": true
          }
        }
      }
    }
  }
}
  1. 同义词库

https://github.com/zhoushineyoung/search-prod/blob/63dba77eaa98a81e29b9ac8e9179ac5b93538da3/solr-cloud/solr-4.7.0/solr/sentiment/conf/synonyms.txt#L1981

这里分享了一个同一个以词库。请注意词库的内容。根据上述如何修改词库,自行决定。我是把同义词用逗号分隔的。我把这个文件中的 => 替换成了逗号。

  1. 如何动态更新
POST article_info_test_1109_2/reload_search_analyzers
# 执行结果
{
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "reload_details" : [
    {
      "index" : "article_info_test_1109_2",
      # 这里可以看到有刷新的分词器。
      "reloaded_analyzers" : [
        "synonym_analyzer"
      ],
      "reloaded_node_ids" : [
        "jiIC9zJyTES_dMIw0w6n8A",
        "dMKuVhnvQySXkO7AfZCXrA",
        "_6o86PMrRlegvJfB_G8bTw"
      ]
    }
  ]
}

三、同义词官方博文

借助同义词让 Elasticsearch 更加强大 | Elastic Blog文章来源地址https://www.toymoban.com/news/detail-785727.html

到了这里,关于Elasticsearch同义词最佳实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • elasticsearch 同义词管理热更新

    项目有需要做一个同义词搜索的功能,就去研究了下es的同义词搜索功能,踩了不少坑记录下 如果只是需要同义词搜索,不需要管理和更新,es本体就能支持,我踩的坑基本也不在这,就不具体说了,参考这个就好了https://blog.csdn.net/qq_40592041/article/details/108006994 插件仓库地址

    2024年02月19日
    浏览(38)
  • Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能

    同义词用于提高搜索质量并扩大匹配范围。 例如,搜索 England 的用户可能希望找到包含 British 或 UK 的文档,尽管这三个词完全不同。 Elasticsearch 中的同义词功能非常强大,如果实施得当,可以使你的搜索引擎更加健壮和强大。 在本文中,我们将通过简单的代码片段介绍在实

    2024年02月13日
    浏览(41)
  • Elasticsearch:词干、Shingles 和同义词过滤器

    分词器生成的分词可能需要进一步丰富或增强,例如小写(或大写)标记、提供同义词、开发词干词、删除撇号或标点符号等。 分词过滤器对分词进行处理以执行此类转换。 Elasticsearch 提供了将近 50 个分词过滤器,正如你可以想象的那样,在这里讨论所有这些过滤器是不可

    2024年02月03日
    浏览(36)
  • docker-compose安装es以及ik分词同义词插件

    目录 1 前言 2 集成利器Docker 2.1 Docker环境安装 2.1.1 环境检查 2.1.2 在线安装 2.1.3 离线安装 2.2 Docker-Compose的安装 2.2.1 概念简介 2.2.2 安装步骤 2.2.2.1 二进制文件安装 2.2.2.2 离线安装 2.2.2.3 yum安装 3 一键安装ES及Kibana 3.1 yml文件的编写 3.1.1 elasticsearch.yml配置 3.1.2 kibana.yml配置 3.2 一键

    2024年04月23日
    浏览(44)
  • 使用阿里云试用Elasticsearch学习:3.6 处理人类语言——同义词

    词干提取是通过简化他们的词根形式来扩大搜索的范围,同义词 通过相关的观念和概念来扩大搜索范围。 也许没有文档匹配查询 “英国女王“ ,但是包含 “英国君主” 的文档可能会被认为是很好的匹配。 用户搜索 “美国” 并且期望找到包含 美利坚合众国 、 美国 、 美

    2024年04月10日
    浏览(41)
  • Elasticsearch教程(35) ik中文分词器+pinyin拼音分词器+同义词

    闲来无事,发现上一篇ES博客还是 去年9月份 写的中文ik分词器 pinyin 首字母 search_as_you_type 组合使用,该篇文章还挖了一个 大坑 没有填,快一年了,是时候填下坑了。 针对股票查询这个特点场景,再结合一般使用者的搜索习惯,暂时确定如下7种期望效果。 上一篇博客Elast

    2023年04月09日
    浏览(45)
  • 同义词替换-批量自动同义词替换软件

    同义词替换,今天给大家分享一款免费的同义词替换器,支持各种同义词替换。一个同义词可以替换多种同义词。同时还支持同义词文章替换详细参考图片 如何优化网站是每个专业SEO人员都熟悉的问题,也是每天必须做的功课之一。接下来,我们来谈谈网站中的高索引

    2024年02月09日
    浏览(37)
  • Oracle系列十二:视图、记录、同义词、序列

    (1)基本概念 Oracle视图是数据库中的一种特殊对象,它是一个虚拟的表,不存储数据,而是基于一个或多个表的查询结果而创建的。视图可以看作是一个 存储在数据库中的查询结果集 ,具有表的特性,包含一系列带有名称的列和行数据, 可以被查询、修改和删除 等。 视图

    2024年02月03日
    浏览(35)
  • Oracle存过-对象权限创建回收、同义词创建删除

    Oracle存过-对象权限创建回收、同义词创建删除

    2024年02月15日
    浏览(38)
  • ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查

            本篇是这个系列的最后一篇了,在这之前可以先看看前面的内容: ES搜索引擎入门+最佳实践(一)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(二)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(三)_flame.liu的博客-CSDN博客 ES搜索引擎入门+最佳实践(四)_flame.liu的博客

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包