全部產品
Search
文件中心

Elasticsearch:使用IK分詞外掛程式(analysis-ik)

更新時間:Aug 19, 2025

IK分詞外掛程式(analysis-ik)是Elasticsearch(簡稱ES)提供的中文分詞擴充外掛程式,內建多種類型的預設詞典,可直接使用。您也可根據業務需求靈活更新詞典,自訂IK分詞外掛程式的預設詞庫或添加新的詞庫,從而最佳化分詞效果,使分詞結果更貼合實際應用情境。IK分詞外掛程式支援從Object Storage Service動態載入詞典檔案,實現遠端管理,提升營運效率。本文為您介紹IK分詞外掛程式的分詞規則、詞典類型,以及如何更新詞典並使用外掛程式。

背景資訊

IK分詞外掛程式的主要組成部分包括分詞器、多種詞典檔案、詞典更新機制。

  • 分詞器:負責將中文文本拆分為有意義的詞語(Token),決定分詞粒度。

  • 詞典檔案:提供詞彙基礎,分詞器需基於詞典檔案進行分詞,支援擴充和定製。

  • 詞典更新方式:支援冷更新和熱更新兩種方式,允許您根據實際情況靈活調整詞庫,確保分詞效果符合業務需求。

分詞規則

IK分詞外掛程式的分詞器支援的分詞規則如下:

  • ik_max_word:將文本按照最細粒度進行拆分,適合術語查詢。

  • ik_smart:將文本按照粗粒度進行拆分,適合短語查詢。

詞典類型

IK分詞外掛程式支援的詞典類型及相關介紹如下。

詞典類型

描述

詞典檔案要求

支援的更新方式

主詞典

預設內建的主詞典為main.dic,包含27萬多條中文詞語。

若在建立ES索引時指定了主分詞詞典,則向索引中寫入資料時,叢集會將該資料與主分詞詞典中的詞進行匹配,並將匹配到的詞建立索引,該索引可通過相應的關鍵詞被檢索到。

每行一個詞,儲存為UTF-8編碼的DIC檔案。

停用詞詞典

預設內建的停用詞詞典為stopword.dic,包含英文停用詞,例如,atheandatbut等。

若在建立ES索引時指定了停用詞詞典,則向索引中寫入資料時,叢集會將該資料與停用詞詞典中的詞進行匹配,並將匹配到的詞過濾,被過濾的詞不會出現在倒排索引中。

介詞詞典

預設內建的介詞詞典為preposition.dic,存放介詞。用於協助分詞器切分介詞與後續詞彙。

不涉及

冷更新

量詞詞典

預設內建的量詞詞典為quantifier.dic,存放單位相關的詞和量詞。用於協助分詞器識別量詞與名片語合。

suffix.dic

存放尾碼詞,用於協助分詞器切分帶有尾碼的詞彙。

不涉及

不支援更新

surname.dic

存放中國的姓氏,用於協助分詞器識別人名。

詞典更新方式

若預設的詞典不符合您的業務需要,您也可按需更新詞典。IK分詞外掛程式支援的詞典更新方式如下。

更新方式

描述

適用情境

冷更新

通過重啟ES叢集來使詞典變更生效。該方式會對整個叢集的詞典進行更新。

系統將上傳的詞典檔案傳送到ES節點,然後重啟ES節點載入詞典檔案。重啟完成後,新配置即可生效。

  • 替換預設詞典檔案或刪除預設詞典檔案中的內容。

  • 更新介詞詞典或量詞詞典檔案。

熱更新

  • 若已有詞典的內容發生變更,不會觸發叢集重啟,叢集會在運行過程中直接載入新詞庫,實現詞典的動態更新。

  • 若已有詞典的名稱發生變化,或詞典檔案清單發生變化(即新增或刪除詞典檔案),會觸發叢集通過重啟來重新載入詞典配置。重啟完成後,新配置即可生效。

說明

僅支援變更主詞典或停用詞詞典。

  • 擴充主詞典或停用詞詞典檔案,即除預設的主詞典或停用詞詞典外,需新增其他的擴充主詞典或停用詞詞典。

  • 變更已有主詞典或停用詞詞典檔案(包括預設詞典及擴充詞典)的內容。

前提條件

  • 請確保執行個體狀態正常。您可在執行個體的基本資料頁面查看執行個體狀態

    說明

    本文操作均使用阿里雲ES7.10.0版本執行個體展示。不同版本執行個體的控制台介面和支援的功能可能存在差異,具體請以實際控制台介面為準。

  • (可選)如需更新詞典,請執行如下操作。

    • 通過上傳OSS檔案方式更新:請先建立OSS Bucket上傳所需詞典檔案。

    • 通過上傳本地檔案方式更新:請先將所需詞典檔案儲存至本地。

更新IK詞典

若預設的IK詞典不滿足您的業務需求,您可按需進行詞典更新。執行更新操作前,請提前瞭解相應更新方式。對於已配置IK分詞的索引,更新詞典後,將只對新資料(包含新增資料和更新後的資料)生效,若您希望對全部資料生效,需重新建立索引。

冷更新

IK詞典冷更新操作如下:

警告

冷更新操作會觸發叢集重啟,為保證您的業務不受影響,請在業務低峰期進行操作。

  1. 進入執行個體詳情頁。

    1. 登入Elasticsearch控制台

    2. 在左側導覽列,單擊Elasticsearch執行個體

    3. 在頂部功能表列,選擇資源群組和地區。

    4. 在Elasticsearch執行個體列表單擊目標執行個體ID,進入執行個體詳情頁。

  2. 進入analysis-ik外掛程式的冷更新頁面。

    1. 在左側導覽列,選擇配置與管理 > 外掛程式配置

    2. 系統預設外掛程式列表頁簽,找到analysis-ik外掛程式,單擊右側操作列的冷更新

  3. 執行冷更新操作。

    1. IK詞庫配置-冷更新對話方塊,單擊目標詞典右側的編輯,按照介面指引上傳所需的詞典檔案後單擊儲存

      您可通過如下方式上傳詞典檔案:

      • 上傳本地檔案:按照介面指引,單擊image表徵圖或通過拖拽方式上傳本地檔案。

      • 上傳OSS檔案:輸入Bucket名稱和詞典檔案名稱,單擊添加

        • Bucket與阿里雲ES執行個體需在同一地區。

        • 不支援自動同步更新OSS中的詞典檔案。若源端OSS中的詞典檔案內容發生變化,需通過IK詞典更新操作使之生效。

      說明
    2. 勾選風險提示並單擊確定,重啟執行個體。

      ES執行個體重啟成功後,詞典檔案即更新成功。

  4. (可選)測試詞典是否生效。

    1. 登入Kibana控制台

    2. 單擊左上方的image表徵圖,選擇Management > 開發工具,進入代碼編輯頁面。

      樣本執行如下代碼,對輸入文本電腦漢字輸入方法進行粗粒度切分。

      說明

      實際使用時,請將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詞典熱更新操作如下:

說明

僅檔案內容變更無需重啟叢集。若檔案數量或檔案名稱變更,仍需重啟叢集,為保證您的業務不受影響,請在業務低峰期進行操作,重啟成功後,詞典會自動生效。

  1. 進入執行個體詳情頁。

    1. 登入Elasticsearch控制台

    2. 在左側導覽列,單擊Elasticsearch執行個體

    3. 在頂部功能表列,選擇資源群組和地區。

    4. 在Elasticsearch執行個體列表單擊目標執行個體ID,進入執行個體詳情頁。

  2. 進入analysis-ik外掛程式的熱更新頁面。

    1. 在左側導覽列,選擇配置與管理 > 外掛程式配置

    2. 系統預設外掛程式列表頁簽,找到analysis-ik外掛程式,單擊右側操作列的熱更新

  3. 執行熱更新操作。

    1. IK詞庫配置-熱更新對話方塊,單擊目標詞典右側的編輯,按照介面指引上傳所需的詞典檔案後單擊儲存

      您可通過如下方式上傳詞典檔案:

      • 上傳本地檔案:按照介面指引,單擊image表徵圖或通過拖拽方式上傳本地檔案。

      • 上傳OSS檔案:輸入Bucket名稱和詞典檔案名稱,單擊添加

        • Bucket與阿里雲ES執行個體需在同一地區。

        • 不支援自動同步更新OSS中的詞典檔案。若源端OSS中的詞典檔案內容發生變化,需通過IK詞典更新操作使之生效。

      說明
      • 支援上傳多個詞典檔案。詞典檔案尾碼必須是.dic,檔案名稱可包含大小寫字母、數字和底線,長度不超過30個字元。

      • 如需修改已上傳詞典的檔案內容,可單擊目標詞典檔案右側的下載按鈕表徵圖,下載並修改詞典檔案,然後刪除原詞典檔案並重新上傳。注意刪除原詞典檔案後,需單擊儲存,否則上傳時會提示已存在同名檔案。

    2. 單擊確定,等待ES節點完成詞典載入。

      阿里雲ES節點的外掛程式具有自動載入詞典檔案的功能,但每個節點擷取詞典檔案的時間存在差異。載入完成後,詞典即可生效,請耐心等待。

  4. (可選)測試詞典是否生效。

    1. 登入Kibana控制台

    2. 單擊左上方的image表徵圖,選擇Management > 開發工具,進入代碼編輯頁面。

      樣本執行如下代碼,對輸入文本電腦漢字輸入方法進行粗粒度切分。

      說明

      實際使用時,請將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過濾器對指定文本進行分詞。

  1. 進入ES執行個體的Kibana開發工具頁面。

    1. 登入Kibana控制台

    2. 單擊左上方的image表徵圖,選擇Management > 開發工具,進入代碼編輯頁面。

  2. 建立索引並配置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

      返回下圖結果,表示建立成功。image

  3. 驗證分詞效果。

    執行如下代碼,對輸入文本這是個測試進行分詞。

    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
        }
      ]
    }
    

相關文檔