全部產品
Search
文件中心

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

更新時間:Jun 16, 2026

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

背景資訊

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

重要

IK分詞外掛程式版本需與Elasticsearch叢集版本保持一致。例如,叢集為 8.17 版本時,IK分詞外掛程式也為 8.17 版本。

  • 分詞器:負責將中文文本拆分為有意義的詞語(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節點載入詞典檔案。重啟完成後,新配置即可生效。

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

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

熱更新

  • 僅已有詞典檔案的內容發生變更且檔案名稱不變時,叢集不用重啟即可動態載入新詞典。

  • 如果詞典檔案名稱發生變更或詞典檔案清單發生變更(新增、刪除或重新命名檔案),叢集需要重啟來重新載入配置。首次配置熱更新時也會觸發叢集重啟。重啟完成後,新配置即可生效。

說明

僅支援更新主詞典和停用詞詞典。

重要

首次配置IK分詞詞庫熱更新或變更詞典檔案清單(新增、刪除、重新命名詞典檔案)時,會觸發叢集重啟。僅在已有詞典檔案內容發生變更且檔案名稱不變的情況下,才能實現動態載入而不重啟叢集。請在業務低峰期執行相關操作,避免影響業務。

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

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

前提條件

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

    說明

    本文操作均使用阿里雲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
        }
      ]
    }
    

最佳化字母數字混合詞檢索

使用ik_max_word分詞器時,字母數字混合詞(如fawjh6bcm)可能無法被有效分詞以供檢索。可通過設定enable_single_word參數為true,將混合詞拆分為單字元 token,提升召回率。

以下樣本建立一個啟用enable_single_word的自訂分析器:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ik_single_char_analyzer": {
          "type": "custom",
          "tokenizer": "my_ik_tokenizer"
        }
      },
      "tokenizer": {
        "my_ik_tokenizer": {
          "type": "ik_max_word",
          "enable_single_word": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "ik_single_char_analyzer"
      }
    }
  }
}

參數

說明

enable_single_word

設定為true可將字母數字混合詞拆分為單字元 token,適用於型號、序號等混合字串的檢索情境。預設值為false

說明

該參數同樣適用於阿里雲 Elasticsearch Serverless 環境。

使用ngram分詞器最佳化中英文混合搜尋

在搜尋連寫英文型號(如jh6bcm)與中文混合的情境中,IK分詞器可能無法產生有效 token 用於部分匹配。此時可使用 ngram tokenizer 替代或配合IK分詞器處理此類情境。

ngram tokenizer 將文本切分為指定長度的連續字元序列,可實現連寫字串的子串匹配。以下樣本建立一個使用 ngram tokenizer 的索引:

PUT my_ngram_index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 3,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "ngram_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "model_number": {
        "type": "text",
        "analyzer": "ngram_analyzer"
      }
    }
  }
}

參數

說明

min_gram

gram 的最小字元長度。預設值為1

max_gram

gram 的最大字元長度。預設值為2

token_chars

token 中包含的字元類型。可選值:letter(字母)、digit(數字)、whitespace(空格)、punctuation(標點)、symbol(符號)。

關於 ngram tokenizer 的更多配置資訊,請參見Ngram tokenizer

常見問題

同義字檔案中包含大寫單詞導致報錯怎麼辦?

IK分詞器處理同義字時對大小寫敏感。如果同義字檔案中包含大寫單詞(如IT),可能引發解析錯誤。

可通過以下任一方式解決:

  • 將同義字檔案中的所有詞彙統一轉換為小寫:編輯同義字檔案,將所有條目轉為小寫後重新上傳。

  • 在 analyzer filter 配置中添加 lowercase 過濾器:在分析器配置中,在 synonym 過濾器之前添加lowercase過濾器,確保分詞前文本已轉為小寫。樣本:

    PUT my_index
    {
      "settings": {
        "analysis": {
          "filter": {
            "my_synonym_filter": {
              "type": "synonym",
              "synonyms_path": "your_synonyms.txt"
            }
          },
          "analyzer": {
            "ik_synonym_analyzer": {
              "type": "custom",
              "tokenizer": "ik_max_word",
              "filter": ["lowercase", "my_synonym_filter"]
            }
          }
        }
      }
    }
    重要

    lowercase過濾器必須排在 synonym 過濾器之前,確保文本在同義字匹配前已轉為小寫。

相關文檔