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'
    

    四、结语

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

  • 相关阅读:
    Android 获取内存信息
    Android上基于libgdx的游戏开发资料
    Android使用http协议与服务器通信
    Android 下载zip压缩文件并解压
    2014年终总结
    OSG 坑爹的Android example
    支持Android 的几款开源3D引擎调研
    利用Android NDK编译lapack
    Django 中实现连接多个数据库并实现读写分离
    Git之多人协同开发
  • 原文地址:https://www.cnblogs.com/orzlin/p/10496861.html
Copyright © 2011-2022 走看看