0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ElasticSearch同义词代码解析

马哥Linux运维 来源:稀土掘金 2023-11-29 10:26 次阅读

索引擎会对文档和查询进行分析并将其拆解为最小的单元(通常称为词元,实际上就是抽象的符号)。搜索时,匹配过程会使用简单字串相似度,所以如果查询中有一些十分微小的拼写错误(例如“hous”,只比“house”少一个字母 e)或者使用名词的复数形式(“houses”),即使文档中包含名词的单数形式(“house”),搜索引擎也不会匹配到这份文档。词干提取器或模糊查询等工具虽然可以解决一些最常见的此类问题,但是它们并不能消除相关联的概念或想法之间的差异,也不能将文档或查询中稍有不同的单词用法视为等同。

这时同义词就派上了大用场。同义词的英文 synonym 来自于希腊语,分别是前缀σύν(syn,表示“一起”)和ὄνομα(ónoma,表示“名称”)。从它的词源可以看出,同义词表示的是在同一语言或领域中具有完全或基本相同意思的不同词语。实际上,同义词的范围非常广泛,包括一般同义词(“疲劳”和“困倦”)、缩写(英镑的两种写法“lb.”和“pound”)、电商搜索中产品的不同拼写(“iPod”和“i-Pod”)、细微的语言差异(例如均表示电梯的英式英语“lift”和美式英语“elevator”)、专业用词和普通用词(例如“犬”和“狗”),甚至单纯表示同一概念的两种方式(“宇宙”和“太空”)。通过提供恰当的同义词规则,搜索工程师能够就哪些词在各自领域内具有相似意思并应该采取相似处理方法提供相关信息

同义词用于提高搜索质量并扩大匹配范围。 例如,搜索oil的用户可能希望找到包含原油或石油的文档,尽管这三个词完全不同。

在我们的很多情况下,我们希望在搜索时,有时能够使用一个词的同义词来进行搜索,这样我们能搜索出来更多相关的内容。我们可以通过 text analysis 来帮助我们形成同义词

索引时使用同义词和搜索时使用同义词的对比

同义词在分析器中使用,其既可在索引时使用,也可在搜索时使用。关于在 Elasticsearch 中如何使用同义词筛选器,最常见的问题之一就是:“我应该索引时使用,还是搜索时使用,还是同时都用?” 我们首先看一下在索引时应用同义词筛选。这意味着会在索引后的文档中对字词进行一次性替换或扩展,结果将一直保存在搜索索引中。

索引时使用同义词有几个劣势:

由于必须对所有同义词进行索引,所以索引规模会变大。

搜索得分(依赖于字词统计数据)可能会受影响,因为同义词也会计算在内,所以不常见单词的统计数据会存在偏差。

除非进行重新索引,否则无法针对既有文档更改同义词规则。

最后两条尤其是巨大劣势。索引时应用同义词的唯一潜在好处是性能好,因为您在前期已费心完成了扩展过程,所以无需再在每次查询时完成一遍扩展过程,这有可能致使需要与更多的字词进行匹配。然而这一点在实践中通常并非真正的问题。

相反,在搜索时所用的分析工具中使用同义词则可以避免很多上述问题:

索引规模不受影响。

语料库中的字词统计数据保持不变。

如需变更同义词规则,无需对文档进行重新索引。

这些优势通常要高出唯一的劣势,即每次查询时都必须执行同义词扩展操作,这有可能导致需要匹配更多字词。不仅如此,搜索时扩展同义词还能够允许使用更加复杂的synonym_graph词元筛选器,这一工具能够正确处理多单词同义词,并且仅可在搜索分析器中使用。

一般而言,搜索时使用同义词的优势通常要高于索引时使用同义词可能实现的微小性能改进。

然而,如果在搜索时使用同义词,过去还需要注意另外一个问题。尽管更改同义词规则不需要对文档进行重新索引,但是如要更改的话,您必须暂时关闭再重新打开索引。这一点很有必要,因为分析器在下列时候才会创建实例:创建索引时,重启节点时,以及重新打开已关闭的索引时。为了让对同义词规则文件所做的变更对索引可见,用户必须首先在所有节点上更新文件,然后再关闭并重新打开索引。但是这个问题已经得以解决。

在查询时对词进行同义词解析

es操作版本8.8.0


创建索引
PUT myindex
{
    "settings": {
        "analysis": {
            "filter": {
                "my_synonyms": {
                    "type": "synonym_graph",
                    "synonyms": [
                        "看月亮,吃月饼=>中秋节",
                        "双十一,双11=>购物",
                        "免费,免费版,不要钱的,无偿"
                    ]
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "my_synonyms"
                    ]
                }
            }
        }
    },
    "mappings": {
            "properties": {
                "content": {
                    "type": "text",
                    "analyzer": "standard",
                    "search_analyzer": "my_analyzer"
                }
            }
        }
    }


展示数据
"hits": {
    "total": 4,
    "max_score": 1.0,
    "hits": [
        {
            "_index": "myindex",
            "_type": "_doc",
            "_id": "luiwhIsB4MmTaMc6fVt7",
            "_score": 1.0,
            "_source": {
                "content": "无偿"
            }
        },
        {
            "_index": "myindex",
            "_type": "_doc",
            "_id": "lOiwhIsB4MmTaMc6a1uu",
            "_score": 1.0,
            "_source": {
                "content": "中秋节"
            }
        },
        {
            "_index": "myindex",
            "_type": "_doc",
            "_id": "p-iwhIsB4MmTaMc68GuR",
            "_score": 1.0,
            "_source": {
                "content": "不要钱的"
            }
        },
        {
            "_index": "myindex",
            "_type": "_doc",
            "_id": "kuiwhIsB4MmTaMc6NFsw",
            "_score": 1.0,
            "_source": {
                "content": "购物"
            }
        }
    ]
}

试查询b1be22de-8dc0-11ee-939d-92fbcf53809c.jpg

b1d40720-8dc0-11ee-939d-92fbcf53809c.jpg

b1e4aba2-8dc0-11ee-939d-92fbcf53809c.jpg

测试查询分词b1f763dc-8dc0-11ee-939d-92fbcf53809c.jpg

b209d47c-8dc0-11ee-939d-92fbcf53809c.jpg

b1e4aba2-8dc0-11ee-939d-92fbcf53809c.jpg

上面我们一直在创建索引时直接指定同义词列表。 但是,当你有大量同义词时,将它们全部添加到索引中会很麻烦。 更好的方法是将它们存储在一个文件中,然后动态地将它们加载到索引中。 使用同义词文件有很多好处,其中包括:

方便维护大量的同义词。

可以被不同的索引使用。

可以在不关闭索引的情况下动态重新加载

我们将创建的同义词文件称为 synonyms.txt,但可以任意命名,把同义词维护进去,加载到es中 默认去读取config目录下

b23cba54-8dc0-11ee-939d-92fbcf53809c.jpg

使用同义词文件创建一个新索引,请注意我们将同义词筛选器标记为了updateable(可更新)


PUT myindex
{
    "settings": {
        "analysis": {
            "filter": {
                "my_synonyms": {
                    "type": "synonym_graph",
                    "synonyms_path": "analysis/synonyms.txt",
                    "updateable": true
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "my_synonyms"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "standard",
                "search_analyzer": "my_analyzer"
            }
        }
    }
}

测试同义词


GET /myindex/_search
{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1,
        "hits": [
            {
                "_index": "myindex",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "content": "齐鲁"
                }
            },
            {
                "_index": "myindex",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "content": "淄博"
                }
            },
            {
                "_index": "myindex",
                "_id": "3",
                "_score": 1,
                "_source": {
                    "content": "戴眼镜"
                }
            }
        ]
    }
}


测试请求: 
GET /myindex/_search
{
    "query": {
        "match": {
            "content": "4眼仔"
        }
    }
}


响应:
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 2.634553,
        "hits": [
            {
                "_index": "myindex",
                "_id": "3",
                "_score": 2.634553,
                "_source": {
                    "content": "戴眼镜"
                }
            }
        ]
    }
}

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分析器
    +关注

    关注

    0

    文章

    92

    浏览量

    12486
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68329
  • Elasticsearch
    +关注

    关注

    0

    文章

    27

    浏览量

    2820

原文标题:ElasticSearch同义词解析

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Windows安装ElasticSearch

    Windows安装ElasticSearch
    的头像 发表于 02-15 17:09 955次阅读
    Windows安装<b class='flag-5'>ElasticSearch</b>

    linux安装配置ElasticSearch之源码安装

    ElasticSearch是基于Lucene这个非常成熟的索引方案,另加上一些分布式的实现:集群,sharding,replication等。以下是对其采用源码安装的方法1.下载
    发表于 01-11 17:27

    MPLAB仿真程序崩溃

    您好,首先我要说的是,我非常新的PIC编程。我已经更改了一个源代码(从PIC10F202),以便PIC10F322的同义词适合于MPLAB ID.V892。我想调试现在的调试器& gt;选择
    发表于 04-03 13:29

    ElasticSearch的初步环境

    ElasticSearch最实用入门指南——初步环境
    发表于 03-31 11:32

    基于同义词典的装备信息集成应用研究

    本文分析了信息化条件下我军装备信息系统集成中存在的数据不同一的问题,介绍了数据同义词典(thesaurus)的定义与设计方法,说明了数据同义词典在装备信息系统设计中的作用
    发表于 12-22 13:40 12次下载

    什么是跨导放大器(Transconductance Ampl

    什么是跨导放大器(Transconductance Amplifier) 将电压转换为电流的放大器, 另外还有其它几个名称(请参考同义词列表)。其中一个同义词是OT
    发表于 04-20 23:08 1.1w次阅读
    什么是跨导放大器(Transconductance Ampl

    elasticsearch介绍PPT

    elasticsearch介绍PPT
    发表于 12-13 21:05 20次下载

    自然语言处理技术入门之基于关键生成文本的技术实现过程

    本章第一节就介绍基于关键生成一段文本的一些处理技术。其主要是应用关键提取、同义词识别等技术来实现的。下面就对实现过程进行说明和介绍。
    的头像 发表于 12-26 18:12 1.1w次阅读
    自然语言处理技术入门之基于关键<b class='flag-5'>词</b>生成文本的技术实现过程

    哈工大PyLTP工具实践:NLP任务中四大必备技术(附代码

    相信从事NLP、数据挖掘、知识图谱等领域的博友都知道哈工大LTP、同义词林这些工具,该系列文章也会介绍相关的知识,希望对您有所帮助。
    的头像 发表于 07-18 11:22 4347次阅读

    加密货币谬论是怎么回事

    虽然货币和金钱是经常使用的同义词,但它们有不同的含义:货币是价值交换系统。
    发表于 10-28 08:45 811次阅读

    EDA增强数据的方法

    随机从句子中抽取n个(抽取时不包括停用词),然后随机找出抽取这些同义词,用同义词将原词替换。
    发表于 05-25 14:55 846次阅读

    ElasticSearch是什么?应用场景是什么?

    ElasticSearch是什么 ElasticSearch的功能 ElasticSearch的应用场景 ElasticSearch的特点
    的头像 发表于 10-09 18:38 2417次阅读

    射频设计中“Bypass”和“Decoupling”的概念

    而且“Bypass”和“Decoupling”很多时候结构类似,很多人也将“Bypass电容”与“Decoupling电容”用做同义词,不过二者的使用目的和设计考虑是不同的。
    发表于 10-10 17:30 2775次阅读

    浅谈封装基板和PCB的区别和关系

    PCB(printed ciruid board)是指搭载了电子元器件的PWB的整个基板为印制电路板。在多数情况下,通常将PWB与PCB按同义词处理而不加区分。
    发表于 03-16 11:29 1.8w次阅读

    Elasticsearch保姆级入门

    我们需要创建一个供 Elasticsearch 和 Kibana 使用的 network。这个 network 将被用于 Elasticsearch 和 Kibana 之间的通信。
    的头像 发表于 09-01 15:24 803次阅读
    <b class='flag-5'>Elasticsearch</b>保姆级入门