从零搭建 ES 搜索服务(三)同义词搜索

摘要:
如上所述,继续使用ik分析器声明ik _智能分词模式被用作分词器的分析器。冲突=继续。结论到目前为止,同义词搜索已经完成。稍后,我们将继续引入其他附加功能,例如拼音搜索和突出显示搜索结果。

一、前言

上篇介绍了 ES 的基础搜索,能满足我们基本的需求,然而在实际使用中还可能希望搜索「番茄」能将包含「西红柿」的结果也罗列出来,本篇将介绍如何实现同义词之间的搜索。


二、安装 ES 同义词插件

2.1 同义词插件简介

GitHub 地址:https://github.com/ginobefun/elasticsearch-dynamic-synonym

定时从 MySQL 中获取自定义词库,支持「扩展词」及「停用词」

2.2 安装步骤

参考 GitHub 中的项目说明


三、自定义分析器

要使用「同义词插件」需要在创建索引时使用「自定义模板」并在自定义模板中「自定义分析器」。

3.1 相关概念

① 字符过滤器(character filter)
② 分词器(tokenizer)
③ 词过滤器(token filter)

自定义分析器官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-analyzers.html

3.2 具体配置

① 在上篇新建的「 yb_knowledge.json 」模板中修改「 setting 」配置,往其中添加自定义分析器

"analysis": {
    "filter": {
        "synonym_filter": {
            "type": "dynamic-synonym",
            "expand": true,
            "ignore_case": true,
            "interval": 30,
            "tokenizer": "ik_max_word",
            "db_url": "jdbc:mysql://localhost:3306/elasticsearch?user=es_user&password=es_pwd&useUnicode=true&characterEncoding=UTF8"
        }
    },
    "analyzer": {
        "ik_synonym_max": {
            "type": "custom",
            "tokenizer": "ik_max_word",
            "filter": [
                "synonym_filter"
            ]
        },
        "ik_synonym_smart": {
            "type": "custom",
            "tokenizer": "ik_smart",
            "filter": [
                "synonym_filter"
            ]
        }
    }
}

自定义分析器说明:

  • 首先声明一个新「 token filter 」—— 「 synonym_filter 」,其中 type 为 dynamic-synonym 即动态同义词插件, interval 为 定时同步频率(单位为秒), db_url 为词库的数据库地址。
  • 其次声明一个新 「analyzer」—— 「ik_synonym_max」,其中 type 为 custom 即自定义类型, tokenizer 为 ik_max_word 即使用 ik 分析器的 ik_max_word 分词模式, filter 为要使用的词过滤器,可以使用多个,这里使用了上述定义的 synonym_filter 。
  • 同上继续声明一个以 ik 分析器的 ik_smart 分词模式作为分词器的分析器。

② 与此同时修改「 mappings 」中的 properties 配置,将「 knowledgeTitle 」及「 knowledgeContent 」这两个字段使用的分析器更换为上述自定义的「 ik_synonym_max 」

"mappings": {
    "knowledge": {
        ...省略其余部分...
        "properties": {
            ...省略其余部分...
            "knowledgeTitle": {
                "type": "text",
                "analyzer": "ik_synonym_max"
            },
            "knowledgeContent": {
                "type": "text",
                "analyzer": "ik_synonym_max"
            }
        }
    }
}

③ 最后删除先前创建的 yb_knowledge 索引并重启 Logstash

注:重建索引后可以通过「_analyze」测试分词结果

blog_3_1.png

④ 原本在索引中已存在的数据不受同义词动态更新的影响,可以通过以下命令手动更新

curl -XPOST 'http://localhost:9200/yb_knowledge/_update_by_query?conflicts=proceed'

四、结语

至此同义词搜索已经实现完毕,后续将继续介绍其他附加功能,如拼音搜索以及搜索结果高亮等。

免责声明:文章转载自《从零搭建 ES 搜索服务(三)同义词搜索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(已弃用)站点的安全防范都是后端的职责?非也,Web前端安全同样不可忽视下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

词语相似度计算

词语相似度计算 当事物可以计算的时候就产生了智能 ----Alert 一、词语相似度 词义相似度计算在很多领域中都有广泛的应用,例如信息检索、信息抽取、文本分类、词义排歧、基于实例的机器翻译等等。国内很多论文主要是基于同义词林和知网来计算的。本文的词语相似度计算是基于《同义词词林》的。 二、同义词林介绍 《同义词词林》是梅家驹等人于1983年编纂而成,这本词...

Sqlserver 使用同义词跨服务器数据库连表查询

  跨服务器,跨数据库查询并不是什么新鲜事,不过之前在工作中看到一段代码,之前也没有接触过数据库同义词,发现挺方便的。代码示例类似这样:   代码很普通,奇怪之处在于A 表在服务器ServerA的DatabaseA中,而B表在服务器ServerB的DatabaseB中。于是我第一反应是linked server,但可以这样写吗?没远程Server 的ip...

oracle不同用户间访问表不添加用户名(模式)前缀

默认的情况下,oracle里面的用户A,要访问用户B的表需要带用户B的前缀,如访问用户B的 user表,需要这样访问 select * from B.user;如果想要不添加用户前缀,需要这样处理:(user01 就是A用户)1.用视图  create view user select * from B.user;2.使用同义词:grant CREATE...