全部產品
Search
文件中心

AnalyticDB:配置自訂分詞詞典

更新時間:Jan 22, 2025

在全文檢索索引過程中,分詞的準確性對於檢索結果至關重要。通用分詞工具僅提供基本支援,通常難以滿足特定領域或行業的特殊需求。例如,在處理法律檔案時,“不可抗力”、“合約履行”等專業術語可能未被納入通用詞彙庫。這可能導致檢索結果出現偏差或遺漏關鍵資訊。如果分詞不夠精確,則返回的結果將無法全面覆蓋使用者的查詢意圖,從而影響使用者體驗。

為了提高分詞精度與檢索效率,jieba分詞器提供了自訂分詞詞典的功能。您可以根據所在行業或特定應用情境的需求,在詞典中添加專有名詞、行業術語甚至最新流行詞語等,從而實現更符合實際需求的文本分割。本文介紹如何配置並使用屬於您的個人化詞典。

版本限制

核心版本為7.2.1.0及以上的AnalyticDB for PostgreSQL7.0版執行個體。

說明

如何查看核心版本,請參見查看核心小版本。如您的執行個體不滿足上述版本要求,建議您升級核心小版本

前提條件

已安裝pgsearch外掛程式。安裝該外掛程式請參見pgsearch安裝與卸載

使用限制

僅jieba分詞器支援自訂字典。

更新詞典

jieba分詞器的詞典儲存於pgsearch.jieba_custom_word表中。更新該表的資料,可以實現分詞的添加、變更或刪除。jieba分詞器的預設詞典為default。您也可以添加多個自訂字典。添加分詞時,如果未指定詞典,則將更新預設詞典。如果指定了default以外的詞典且該詞典不存在,將新增詞典並在新增的詞典中添加分詞;如果該詞典已存在,則直接在該詞典中添加分詞。如果您在更新或刪除自訂分詞時未指定詞典,則將在所有詞典中檢索並更新或刪除指定的分詞。

  • 向預設詞典中插入、更新或刪除自訂分詞。

    -- 未指定詞典名稱時,則在預設詞典插入自訂分詞
    INSERT INTO pgsearch.jieba_custom_word(word) VALUES('永和服裝飾品');
    
    -- 插入自訂分詞並指定詞典為預設詞典“default”
    INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('default', '永和服裝飾品');
    
    -- 刪除預設詞典的自訂分詞
    DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'default' AND word='永和服裝飾品';
    
    -- 更新預設詞典的自訂分詞
    UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'default' AND word = '永和服裝飾品';
  • 向自訂字典中插入、更新或刪除自訂分詞。

    -- 插入自訂分詞並指定詞典為“custom_dict”
    INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('custom_dict', '永和服裝飾品');
    
    -- 刪除自訂分詞
    DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'custom_dict' AND word='永和服裝飾品';
    
    -- 更新自訂分詞
    UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'custom_dict' AND word = '永和服裝飾品';
說明

詞典名稱列dict和自訂分詞列word為表的聯合主鍵。因此無法向同一個詞典中插入重複的自訂分詞。

載入詞典

更新pgsearch.jieba_custom_word中的詞典後,需要調用SELECT pgsearch.reload_user_dict()將詞典重新載入到記憶體中。以下樣本中的custom_dict為詞典名稱。

SELECT pgsearch.reload_user_dict('custom_dict');

將詞典載入到記憶體後,還需要按順序完成以下兩個步驟,方能使自訂字典對現有資料生效。

  1. 已有的資料庫會話串連需要斷開並重新串連。

  2. 更新詞典不會影響已寫入到表中的資料。如果希望詞典對已有資料生效必須重建索引。

使用詞典建立索引

在建立BM25索引時,可以為jieba分詞器指定自訂分詞詞典。

  • 為表的某列指定詞典。

    CALL pgsearch.create_bm25(
        index_name => '<index_name>',
        table_name => '<table_name>',
        text_fields => pgsearch.field('<column_name>', tokenizer=>pgsearch.tokenizer('jieba',dict=>'<dict_name>')) 
    );
  • 為同一張表的不同列指定不同的詞典。

    CALL pgsearch.create_bm25(
        index_name => '<index_name>',
        table_name => '<table_name>',
        text_fields => pgsearch.field('<column1_name>', tokenizer=>pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'<dict_name>')) 
                    || pgsearch.field('<column2_name>', tokenizer=>pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'<dict2_name>'))
    );

查看自訂字典的分詞效果

您可在pgsearch.tokenizer()函數(該函數可用於擷取分詞結果)中指定jieba分詞器和自訂分詞詞典,以查看自訂字典的分詞效果。pgsearch.tokenizer()函數的詳細用法請參見參數說明

查看指定詞典的分詞效果。

SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'custom_dict'), '永和服裝飾品有限公司');