從零搭建 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'

四、結語

至此同義詞搜索已經實現完畢,后續將繼續介紹其他附加功能,如拼音搜索以及搜索結果高亮等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM