本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
IK分詞插件(analysis-ik)是阿里云Elasticsearch(簡稱ES)的擴展插件,提供了基于詞典的分詞能力,默認不能卸載。所有類型的詞典均默認使用IK分詞插件的原生配置文件,通過更新詞典,您可以修改IK分詞插件的默認詞庫或添加新的詞庫,改善分詞效果,讓分詞結果更加符合業務場景需求。在開源插件的基礎上,IK分詞插件擴展支持了通過對象存儲OSS動態加載詞典文件的功能。
前提條件
集群狀態為正常,可在實例的基本信息頁面查看。具體操作請參見查看實例的基本信息。
部分低版本實例的界面和支持的功能可能與本文有區別,請以控制臺為準。
IK分詞插件介紹
IK分詞器的分詞規則
IK分詞插件的分詞器的分詞規則包括ik_smart和ik_max_word兩種:
ik_max_word:將文本按照最細粒度進行拆分,適合術語查詢。例如會將
計算機漢字輸入方法
拆分為計算機,計算,算機,漢字輸入,漢字,輸入,方法
。ik_smart:將文本按照粗粒度進行拆分,適合短語查詢。例如會將
計算機漢字輸入方法
拆分為計算機,漢字輸入,方法
。
支持的詞典類型
IK分詞插件支持以下幾種詞典類型:
詞典類型 | 詞典說明 | 詞典文件要求 | 更新方式 |
主詞典(main.dic) | IK分詞插件原生內置的主詞典包含27萬多條中文詞語。 如果在創建ES索引時指定了主分詞詞典,向集群中寫入數據時,數據中包含主分詞詞典中的詞,集群就會建立索引,并且該索引能通過關鍵詞被查詢到。 | 每行一個詞,保存為UTF-8編碼的DIC文件。 | |
停用詞詞典(stopword.dic) | IK分詞插件原生內置的停用詞詞典中包含英文的停用詞,例如a、the、and、at、but等。 如果在創建ES索引時指定了停用詞詞典,向索引中寫入數據時,數據中包含的停用詞詞典中的詞會被過濾掉,不會出現在倒排索引中。 說明 如果您需要使用中文停用詞,可參考官方ES默認的IK分詞配置文件中config目錄下的 | ||
介詞詞典(preposition.dic) | 存放介詞 | - | |
量詞詞典(quantifier.dic) | 存放單位相關的詞和量詞。 | ||
suffix.dic | 存放后綴 | - | 不支持更新 |
surname.dic | 存放中國的姓氏。 |
支持的詞典更新方式
阿里云ES的IK分詞插件支持IK詞典冷更新和IK詞典熱更新。
更新方式 | 生效方式 | 加載方式 | 推薦應用場景 |
冷更新 | 對整個集群的詞典進行更新,詞典生效會觸發集群重啟。 | 系統將上傳的詞典文件傳送到ES節點上,然后重啟ES節點加載詞典文件。 |
|
熱更新 |
|
| 如果您需要擴充主詞典或停用詞詞典文件,或變更擴充詞典文件,建議使用IK詞典熱更新。 |
更新詞典
對于已經配置了IK分詞的索引,IK詞典冷更新或熱更新完成后,將只對新數據(包含新增數據和更新后的數據)生效。如果您希望對全部數據生效,需要重建索引。
IK詞典冷更新
您可以通過冷更新方式替換詞典文件,替換過程需要重啟ES集群。
冷更新操作會觸發集群重啟,為保證您的業務不受影響,請在業務低峰期進行操作。
- 登錄阿里云Elasticsearch控制臺。
- 在左側導航欄,單擊Elasticsearch實例。
- 進入目標實例。
- 在頂部菜單欄處,選擇資源組和地域。
- 在Elasticsearch實例中單擊目標實例ID。
在左側導航欄,選擇 。
在系統默認插件列表頁簽,找到analysis-ik插件,在其右側操作列中單擊冷更新。
在IK詞庫配置-冷更新控制面板,單擊目標詞典右側的編輯,添加或替換對應的詞典文件后單擊保存。
詞典文件更新方式包括:
上傳本地文件:單擊文件上傳區域上傳詞典文件,或拖拽詞典文件到上傳區域。
上傳OSS文件:輸入Bucket名稱和詞典文件名稱,單擊添加。
Bucket與阿里云ES實例需要在同一地域。
不支持自動同步更新詞典文件。源端OSS中的詞典文件內容發生變化后,需要通過冷更新使之生效。
說明詞典文件后綴必須是
.dic
,詞典文件名可以包含大小寫字母、數字和下劃線,長度不超過30個字符。每種類型的詞典僅支持上傳一個DIC格式文件,變更發起后會用您上傳的詞典替換原詞典。
如果您需要恢復詞典的默認文件,下載默認詞典文件后上傳。獲取默認詞典文件,請單擊下載:
單擊確定。
ES實例重啟成功后,即詞典文件更新成功。
(可選)登錄ES實例的Kibana控制臺,測試詞典是否生效。
說明登錄Kibana控制臺,請參見登錄Kibana控制臺。
在Kibana控制臺的開發工具(Dev Tools)上執行以下代碼:
GET _analyze { "analyzer": "ik_smart", "text": ["您詞典中包含的詞"] }
text
的值為["計算機漢字輸入方法"]
,則返回結果如下:{ "tokens" : [ { "token" : "計算機", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "漢字輸入", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 1 }, { "token" : "方法", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 2 } ] }
IK詞典熱更新
您可以通過擴展詞典更新的方式擴充主詞典和停用詞詞典。如果詞典文件名和文檔數量不發生變化,則不需要重啟ES集群。
- 登錄阿里云Elasticsearch控制臺。
- 在左側導航欄,單擊Elasticsearch實例。
- 進入目標實例。
- 在頂部菜單欄處,選擇資源組和地域。
- 在Elasticsearch實例中單擊目標實例ID。
在左側導航欄,選擇 。
在系統默認插件列表頁簽,找到analysis-ik插件,在其右側的操作列中單擊熱更新。
在IK詞庫配置-熱更新控制面板,單擊目標詞典右側的編輯,上傳對應的詞典文件后單擊保存。
詞典文件更新方式包括:
上傳本地文件:單擊文件上傳區域上傳詞典文件,或拖拽詞典文件到上傳區域。
上傳OSS文件:輸入Bucket名稱和詞典文件名稱,單擊添加。
Bucket與阿里云ES實例需要在同一地域。
不支持自動同步更新詞典文件。源端OSS中的詞典文件內容發生變化后,需要通過熱更新使之生效。
說明詞典文件后綴必須是
.dic
,文件名可以包含大小寫字母、數字和下劃線,長度不超過30個字符。如果您需要修改已上傳的詞典文件內容,可單擊目標詞典文件右側的圖標,下載、修改詞典文件,然后刪除源詞典文件并重新上傳。
支持上傳多個詞典文件,僅詞典文件內容發生變化時集群不需要重啟,文件名稱或文件數量發生變化時需要集群重啟。為保證您的業務不受影響,請在業務低峰期進行操作,等待重啟結束后,詞典會自動生效。
在頁面底部,單擊確定。
阿里云ES節點上的插件具有自動加載詞典文件的功能,但每個節點獲取詞典文件的可能時間不同,請耐心等待詞典生效。
(可選)登錄ES實例的Kibana控制臺,測試詞典是否生效。
說明登錄Kibana控制臺,請參見登錄Kibana控制臺。
為保證準確性,在Kibana控制臺的開發工具(Dev Tools)上多次執行以下命令進行驗證。
GET _analyze { "analyzer": "ik_smart", "text": ["您詞典中包含的詞"] }
text
的值為["計算機漢字輸入方法"]
,則返回結果如下。{ "tokens" : [ { "token" : "計算機", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "漢字輸入", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 1 }, { "token" : "方法", "start_offset" : 7, "end_offset" : 9, "type" : "CN_WORD", "position" : 2 } ] }
IK和Pinyin分詞器結合使用示例
- 登錄目標阿里云Elasticsearch實例的Kibana控制臺,根據頁面提示進入Kibana主頁。登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。說明 本文以阿里云Elasticsearch 7.10.0版本為例,其他版本操作可能略有差別,請以實際界面為準。
- 單擊右上角的Dev tools。
在Console中執行以下命令,創建索引并配置IK和Pinyin分詞器。
示例如下:
PUT ik_pinyin { "settings":{ "analysis": { "filter": { "my_pinyin" : { "type" : "pinyin", "keep_separate_first_letter" : false, "keep_full_pinyin" : true, "keep_original" : true, "limit_first_letter_length" : 16, "lowercase" : true, "remove_duplicated_term" : true } }, "analyzer": { "ik_pinyin_analyzer": { "type": "custom", "tokenizer": "ik_max_word", "filter": ["my_pinyin"] } } } }, "mappings":{ "properties":{ "text":{ "type" : "text", "analyzer" : "ik_pinyin_analyzer" } } } }
說明Pinyin分析插件的具體配置請參見Pinyin Analysis for Elasticsearch。
驗證分詞效果。
GET ik_pinyin/_analyze { "text": ["這是個測試"], "analyzer": "ik_pinyin_analyzer" }
預期結果如下:
{ "tokens" : [ { "token" : "zhe", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "shi", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 1 }, { "token" : "這是", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 1 }, { "token" : "zs", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 1 }, { "token" : "ge", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "個", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "g", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 2 }, { "token" : "ce", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 3 }, { "token" : "shi", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 }, { "token" : "測試", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 }, { "token" : "cs", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 } ] }
相關文檔
IK詞典熱更新的API文檔:UpdateHotIkDicts
IK詞典冷更新的API文檔:UpdateDict