實現 elastic search ik 詞庫熱更新,修改後發送釘釘提醒
ik 是 elastic search 一個常用的分詞插件,自帶了一些中文得詞庫,但在特定領域,這些詞庫遠遠不能滿足我們的名稱,比如有些詞語:品牌名稱、遊戲人物名稱、劇情名稱、產品種類等,在特定領域時我們需要添加一定的領域詞語。
ik配置文件解析
進入 ik 插件的 config 目錄,發現有個文件IKAnalyzer.cfg.xml
,這個文件就是ik的配置文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴展配置</comment>
<!--用戶可以在這裏配置自己的擴展字典 -->
<entry key="ext_dict"></entry>
<!--用戶可以在這裏配置自己的擴展停止詞字典-->
<entry key="ext_stopwords"></entry>
<!--用戶可以在這裏配置遠程擴展字典 -->
<entry key="remote_ext_dict">http://127.0.0.1:8080/words.dic</entry>
<!--用戶可以在這裏配置遠程擴展停止詞字典-->
<entry key="remote_ext_stopwords">http://127.0.0.1:8080/stop_words.dic</entry>
</properties>
後面兩個配置項,其實是 ik 給我們留的鉤子,ik會自動從這兩個 url 的響應裏保存詞庫。
閱讀 ik 源碼發現,當有這個配置項時,會啓動一個線程,每60s請求這兩個地址,並根據返回值的更新時間,來決定是否更新擴展詞庫。
那我們如何用這個實現熱更新呢?
利用 nginx 實現詞庫熱更新
我們可以自己寫一個web服務,來響應這兩個url,當然最簡單的便是利用web服務器來實現。
在 nginx.conf 中加入以下內容
# ik ext
server {
listen 8080;
root /myfile/ik;
}
然後在 /myfile/ik
文件下建立這兩個文件,修改這兩個文件,即可實現擴展詞庫熱更新(最大60s延遲)
touch words.dic stop_words.dic
利用 git + CICD 實現追蹤變化,自動更新
之前我自己搭建git私服,並利用gogs搭建了cicd系統,這裏便可利用git的管理和cicd實現追蹤和熱更新,在.drone.yml
中加入如下
kind: pipeline
name: default
steps:
- name: 複製到 localFileDir
image: alpine
volumes:
- name: localFileDir
path: /localFileDir
commands:
- cp -f stop_words.dic /localFileDir/stop_words.dic
- cp -f words.dic /localFileDir/words.dic
- name: 釘釘通知
image: guoxudongdocker/drone-dingtalk
settings:
token: yourToken
type: markdown
volumes:
- name: localFileDir
host:
path: /myfile/ik
trigger:
branch:
- master
好處
- 可以在線以頁面的方式熱更新詞庫
- 可以分配多個管理者一起維護詞庫
- 可以通過git來追蹤詞庫的變化
- 修改後發送釘釘提醒