zoukankan      html  css  js  c++  java
  • 从零搭建 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'
    

    四、结语

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

  • 相关阅读:
    flex学习网站地址
    ASP.NET 开发人员应该知道的8个网站
    登入页面添加图片有重复页面出现怎么办
    一行代码是有两个??
    c# 枚举基础有[flags]和没有的的区别
    c#中[Flags] 枚举类型定义问题_百度知道
    写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
    Margin和Padding之间的区别
    对于top.ascx里面可以不可以放置css的文件进行一个讲解
    设计模式之--适配器模式(Adapter)
  • 原文地址:https://www.cnblogs.com/orzlin/p/10496861.html
Copyright © 2011-2022 走看看