Elasticsearch-IK分詞器詳解以及原始碼修改實現mysql熱更新
- IK分詞器的安裝和使用
訪問ik分詞器github專案地址:https://github.com/medcl/elasticsearch-analysis-ik
1.在本地clone專案程式碼,git clone https://github.com/medcl/elasticsearch-analysis-ik.git
2.切換到對應本地elasticsearch版本號的tag,git checkout tags/5.5.2
3.通過maven進行專案打包,mvn package
4.拷貝/target/release/xxx.zip到/es/plugins/ik下面並解壓出來(注意層級關係,ik目錄下直接是解壓後的所有檔案,不能夠再有資料夾目錄)
5.重啟elasticsearch服務未報錯即可
IK分詞器有兩種Analyzer: ik_smart , ik_max_word,前者會做粗粒度的拆分,後者會做細粒度的儘可能多的拆分,一般使用後者來進行對中文的分詞處理
- IK分詞器的使用
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"text":{
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
GET /_analyze
{
"text" :"你好 我來自深圳市 正在學習搜尋技術",
"analyzer": "ik_max_word"
}
結果可以看到被分成了很多個詞
- IK分詞器配置檔案詳解以及自定義詞庫
- 找到ik/config目錄下IKAnalyzer.cfg.xml檔案,用來配置自定義詞庫
- main.dic是原生詞庫總共27萬,只要是這些詞,都會被分詞在一起
- quantifier.dic是一些單位的相關詞
- suffix.dic是一些地方相關的字尾
- surname.dic是一些姓相關的詞
- stopword.dic是英文停用詞
最重要的配置是main.dic和stopword.dic
自定義詞庫:
修改IKAnalyzer.cfg.xml配置檔案,配置自定義擴充套件詞庫和停詞詞庫:
<properties>
<comment>IK Analyzer 擴充套件配置</comment>
<!--使用者可以在這裡配置自己的擴充套件字典 -->
<entry key="ext_dict">custom/mydict.dic</entry>
<!--使用者可以在這裡配置自己的擴充套件停止詞字典-->
<entry key="ext_stopwords">custom/ext_sotpword.dic</entry>
<!--使用者可以在這裡配置遠端擴充套件字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--使用者可以在這裡配置遠端擴充套件停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
在custom/mydict.dic和custom/ext_sotpword.dic下新增自定義的停用詞然後重啟es
➜ config cat mydict.dic
網紅
藍瘦香菇
鬼畜
新增以上自定義詞語,然後再進行分詞測試
GET /my_index/_analyze
{
"text":"藍瘦香菇 ",
"analyzer": "ik_max_word"
}
返回
{
"tokens": [
{
"token": "藍瘦香菇",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 0
},
{
"token": "香菇",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
}
]
}
- 修改IK分詞器原始碼來基於mysql熱更新詞庫
對於分散式的es叢集,不可能去每個節點手動新增自定義的詞語,還要保證不停機
兩種熱更新的方案:
- 1.修改ik分詞器原始碼,然後手動支援從mysql中每隔一定時間,自動載入新的詞庫
- 2.基於ik分詞器原生支援的熱更新方案,部署一個web伺服器,提供一個http介面,通過modified和tag響應頭,來提供詞語的熱更新
通常會採用第一種方案,對於第二種官方也不推薦,因為不太穩定
修改原始碼步驟如下:
1、下載原始碼
ik分詞器,是個標準的java maven工程,直接匯入eclipse就可以看到原始碼
2、修改原始碼
Dictionary類,169行:Dictionary單例類的初始化方法,在這裡需要建立一個我們自定義的執行緒,並且啟動它
HotDictReloadThread類:就是死迴圈,不斷呼叫Dictionary.getSingleton().reLoadMainDict(),去重新載入詞典
Dictionary類,389行:this.loadMySQLExtDict();
Dictionary類,683行:this.loadMySQLStopwordDict();
3、mvn package打包程式碼
target\releases\elasticsearch-analysis-ik-5.2.0.zip
4、解壓縮ik壓縮包
將mysql驅動jar,放入ik的目錄下
5、修改jdbc相關配置
6、重啟es
觀察日誌,日誌中就會顯示我們列印的那些東西,比如載入了什麼配置,載入了什麼詞語,什麼停用詞
7、在mysql中新增詞庫與停用詞
8、分詞實驗,驗證熱更新生效