elastic search ik 詞庫熱更新

實現 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來追蹤詞庫的變化
  • 修改後發送釘釘提醒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章