一、前言
上篇介紹了 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」測試分詞結果
④ 原本在索引中已存在的數據不受同義詞動態更新的影響,可以通過以下命令手動更新
curl -XPOST 'http://localhost:9200/yb_knowledge/_update_by_query?conflicts=proceed'
四、結語
至此同義詞搜索已經實現完畢,后續將繼續介紹其他附加功能,如拼音搜索以及搜索結果高亮等。