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

    文章

    90

    浏览量

    12410
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
  • Elasticsearch
    +关注

    关注

    0

    文章

    25

    浏览量

    2788

原文标题:ElasticSearch同义词解析

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

收藏 人收藏

    评论

    相关推荐

    Windows安装ElasticSearch

    Windows安装ElasticSearch
    的头像 发表于 02-15 17:09 697次阅读
    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查询 第三篇:词条查询
    发表于 04-30 17:03

    docker安装Elasticsearch操作指南

    docker安装Elasticsearch以及分词器
    发表于 09-16 16:53

    ElasticSearch的初步环境

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

    ARMV8-aarch64异常和中断处理概念详细介绍

    ))采取某些操作,以确保系统的平稳运行中断有时用作异常的同义词。但是对于ARM的术语来说,中断是异步异常,只是异常的一种;异常是一个事件(而不是分支或跳转指令)导致指令的正常顺序执行被修改。一个中断是一个
    发表于 06-01 17:46

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

    本文分析了信息化条件下我军装备信息系统集成中存在的数据不同一的问题,介绍了数据同义词典(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次下载

    EDA增强数据的方法

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

    教你们怎么在Django中使用ElasticSearch

    什么是ElasticsearchElasticsearch是基于Lucene库的搜索引擎。它提供了具有HTTP Web界面和无模式JSON文档的分布式,多租户功能的全文本搜索引擎
    的头像 发表于 06-11 16:01 1716次阅读

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

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

    Elasticsearch保姆级入门

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

    SpringBoot 连接ElasticSearch的使用方式

    在上篇 ElasticSearch 文章中,我们详细的介绍了 ElasticSearch 的各种 api 使用。 实际的项目开发过程中,我们通常基于某些主流框架平台进行技术开发,比如
    的头像 发表于 10-09 10:35 426次阅读