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


    一、前言

    上篇介绍了 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'
    

    四、结语

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

  • 相关阅读:
    bestcoder 48# wyh2000 and a string problem (水题)
    Install OpenCV3.0 on Eclipse
    sql 优化 -- sql中的自定函数
    java基础知识总结1
    【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)
    ESLint 配置
    Vue命名规范
    在vue中使用jsx语法
    vue中8种组件通信方式, 值得收藏!
    Vue+Express实现登录状态权限控制
  • 原文地址:https://www.cnblogs.com/orzlin/p/10496861.html
Copyright © 2020-2023  润新知