IK分詞外掛程式(analysis-ik)是Elasticsearch(簡稱ES)提供的中文分詞擴充外掛程式,內建多種類型的預設詞典,可直接使用。您也可根據業務需求靈活更新詞典,自訂IK分詞外掛程式的預設詞庫或添加新的詞庫,從而最佳化分詞效果,使分詞結果更貼合實際應用情境。IK分詞外掛程式支援從Object Storage Service動態載入詞典檔案,實現遠端管理,提升營運效率。本文為您介紹IK分詞外掛程式的分詞規則、詞典類型,以及如何更新詞典並使用外掛程式。
背景資訊
IK分詞外掛程式的主要組成部分包括分詞器、多種詞典檔案、詞典更新機制。
分詞器:負責將中文文本拆分為有意義的詞語(Token),決定分詞粒度。
詞典檔案:提供詞彙基礎,分詞器需基於詞典檔案進行分詞,支援擴充和定製。
詞典更新方式:支援冷更新和熱更新兩種方式,允許您根據實際情況靈活調整詞庫,確保分詞效果符合業務需求。
分詞規則
IK分詞外掛程式的分詞器支援的分詞規則如下:
ik_max_word:將文本按照最細粒度進行拆分,適合術語查詢。
ik_smart:將文本按照粗粒度進行拆分,適合短語查詢。
詞典類型
IK分詞外掛程式支援的詞典類型及相關介紹如下。
詞典類型 | 描述 | 詞典檔案要求 | 支援的更新方式 |
主詞典 | 預設內建的主詞典為 若在建立ES索引時指定了主分詞詞典,則向索引中寫入資料時,叢集會將該資料與主分詞詞典中的詞進行匹配,並將匹配到的詞建立索引,該索引可通過相應的關鍵詞被檢索到。 | 每行一個詞,儲存為 | |
停用詞詞典 | 預設內建的停用詞詞典為 若在建立ES索引時指定了停用詞詞典,則向索引中寫入資料時,叢集會將該資料與停用詞詞典中的詞進行匹配,並將匹配到的詞過濾,被過濾的詞不會出現在倒排索引中。 | ||
介詞詞典 | 預設內建的介詞詞典為 | 不涉及 | |
量詞詞典 | 預設內建的量詞詞典為 | ||
suffix.dic | 存放尾碼詞,用於協助分詞器切分帶有尾碼的詞彙。 | 不涉及 | 不支援更新 |
surname.dic | 存放中國的姓氏,用於協助分詞器識別人名。 |
詞典更新方式
若預設的詞典不符合您的業務需要,您也可按需更新詞典。IK分詞外掛程式支援的詞典更新方式如下。
更新方式 | 描述 | 適用情境 |
通過重啟ES叢集來使詞典變更生效。該方式會對整個叢集的詞典進行更新。 系統將上傳的詞典檔案傳送到ES節點,然後重啟ES節點載入詞典檔案。重啟完成後,新配置即可生效。 |
| |
說明 僅支援變更主詞典或停用詞詞典。 |
|
前提條件
請確保執行個體狀態正常。您可在執行個體的基本資料頁面查看執行個體狀態。
說明本文操作均使用阿里雲ES
7.10.0版本執行個體展示。不同版本執行個體的控制台介面和支援的功能可能存在差異,具體請以實際控制台介面為準。(可選)如需更新詞典,請執行如下操作。
通過上傳OSS檔案方式更新:請先建立OSS Bucket並上傳所需詞典檔案。
通過上傳本地檔案方式更新:請先將所需詞典檔案儲存至本地。
更新IK詞典
若預設的IK詞典不滿足您的業務需求,您可按需進行詞典更新。執行更新操作前,請提前瞭解相應更新方式。對於已配置IK分詞的索引,更新詞典後,將只對新資料(包含新增資料和更新後的資料)生效,若您希望對全部資料生效,需重新建立索引。
冷更新
IK詞典冷更新操作如下:
冷更新操作會觸發叢集重啟,為保證您的業務不受影響,請在業務低峰期進行操作。
進入執行個體詳情頁。
在左側導覽列,單擊Elasticsearch執行個體。
在頂部功能表列,選擇資源群組和地區。
在Elasticsearch執行個體列表單擊目標執行個體ID,進入執行個體詳情頁。
進入
analysis-ik外掛程式的冷更新頁面。在左側導覽列,選擇。
在系統預設外掛程式列表頁簽,找到
analysis-ik外掛程式,單擊右側操作列的冷更新。
執行冷更新操作。
在IK詞庫配置-冷更新對話方塊,單擊目標詞典右側的編輯,按照介面指引上傳所需的詞典檔案後單擊儲存。
您可通過如下方式上傳詞典檔案:
上傳本地檔案:按照介面指引,單擊
表徵圖或通過拖拽方式上傳本地檔案。上傳OSS檔案:輸入Bucket名稱和詞典檔案名稱,單擊添加。
Bucket與阿里雲ES執行個體需在同一地區。
不支援自動同步更新OSS中的詞典檔案。若源端OSS中的詞典檔案內容發生變化,需通過IK詞典更新操作使之生效。
說明每種類型的詞典僅支援上傳一個
DIC格式的檔案,且變更發起後會使用當前上傳的詞典替換原詞典。詞典檔案尾碼必須是
.dic,檔案名稱可包含大小寫字母、數字和底線,長度不超過30個字元。如需恢複詞典的預設檔案,可下載預設詞典檔案後重新上傳。擷取預設詞典檔案,請參考:
勾選風險提示並單擊確定,重啟執行個體。
ES執行個體重啟成功後,詞典檔案即更新成功。
(可選)測試詞典是否生效。
單擊左上方的
表徵圖,選擇,進入代碼編輯頁面。樣本執行如下代碼,對輸入文本
電腦漢字輸入方法進行粗粒度切分。說明實際使用時,請將
text的內容替換為您詞典中包含的詞。GET _analyze { "analyzer": "ik_smart", "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詞典熱更新操作如下:
僅檔案內容變更無需重啟叢集。若檔案數量或檔案名稱變更,仍需重啟叢集,為保證您的業務不受影響,請在業務低峰期進行操作,重啟成功後,詞典會自動生效。
進入執行個體詳情頁。
在左側導覽列,單擊Elasticsearch執行個體。
在頂部功能表列,選擇資源群組和地區。
在Elasticsearch執行個體列表單擊目標執行個體ID,進入執行個體詳情頁。
進入
analysis-ik外掛程式的熱更新頁面。在左側導覽列,選擇。
在系統預設外掛程式列表頁簽,找到
analysis-ik外掛程式,單擊右側操作列的熱更新。
執行熱更新操作。
在IK詞庫配置-熱更新對話方塊,單擊目標詞典右側的編輯,按照介面指引上傳所需的詞典檔案後單擊儲存。
您可通過如下方式上傳詞典檔案:
上傳本地檔案:按照介面指引,單擊
表徵圖或通過拖拽方式上傳本地檔案。上傳OSS檔案:輸入Bucket名稱和詞典檔案名稱,單擊添加。
Bucket與阿里雲ES執行個體需在同一地區。
不支援自動同步更新OSS中的詞典檔案。若源端OSS中的詞典檔案內容發生變化,需通過IK詞典更新操作使之生效。
說明支援上傳多個詞典檔案。詞典檔案尾碼必須是
.dic,檔案名稱可包含大小寫字母、數字和底線,長度不超過30個字元。如需修改已上傳詞典的檔案內容,可單擊目標詞典檔案右側的
表徵圖,下載並修改詞典檔案,然後刪除原詞典檔案並重新上傳。注意刪除原詞典檔案後,需單擊儲存,否則上傳時會提示已存在同名檔案。
單擊確定,等待ES節點完成詞典載入。
阿里雲ES節點的外掛程式具有自動載入詞典檔案的功能,但每個節點擷取詞典檔案的時間存在差異。載入完成後,詞典即可生效,請耐心等待。
(可選)測試詞典是否生效。
單擊左上方的
表徵圖,選擇,進入代碼編輯頁面。樣本執行如下代碼,對輸入文本
電腦漢字輸入方法進行粗粒度切分。說明實際使用時,請將
text的內容替換為您詞典中包含的詞。GET _analyze { "analyzer": "ik_smart", "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分詞外掛程式
本文樣本使用IK分詞器及Pinyin過濾器對指定文本進行分詞。
進入ES執行個體的Kibana開發工具頁面。
單擊左上方的
表徵圖,選擇,進入代碼編輯頁面。
建立索引並配置IK分詞器及Pinyin過濾器。
在開發工具頁面執行如下命令,建立
ik_pinyin索引,並自訂分析器ik_pinyin_analyzer。該分析器使用細粒度的分詞規則ik_max_word,同時,配置拼音過濾器,可將中文詞轉換為拼音。說明拼音過濾器會在中文分詞完成後執行,即系統優先進行中文分詞,然後再將分詞結果轉化為拼音一併輸出。
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" } } } }核心參數說明如下:
拼音過濾器(即
filter)說明Pinyin分析外掛程式的更多配置,請參見Pinyin Analysis for Elasticsearch。
參數
描述
my_pinyin
表示您定義的拼音過濾器名稱。
type
配置為
pinyin,表示拼音過濾器。keep_separate_first_letter
配置為
false,表示不保留每個字的首字母。keep_full_pinyin
配置為
true,表示保留完整的拼音。keep_original
配置為
true,表示保留原始輸入文本。limit_first_letter_length
配置為
16,表示限制首字母長度不超過16個字元。lowercase
配置為
true,表示輸出的拼音使用小寫。remove_duplicated_term
配置為
true,表示去除重複詞。例如,避免出現“zh,zh”。分析器(即
analyzer):參數
描述
ik_pinyin_analyzer
表示您定義的分析器名稱。
type
配置為
custom,表示自訂分析器。tokenizer
配置為
ik_max_word,表示將文本按照最細粒度進行拆分。filter
配置為
my_pinyin,表示調用拼音過濾器my_pinyin。返回下圖結果,表示建立成功。

驗證分詞效果。
執行如下代碼,對輸入文本
這是個測試進行分詞。GET ik_pinyin/_analyze { "text": "這是個測試", "analyzer": "ik_pinyin_analyzer" }預期的返回結果如下。
{ "tokens" : [ { "token" : "zhe", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "這是", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "zs", "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" : "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