配置自定义分词词典

更新时间:

在全文检索过程中,分词的准确性对于检索结果至关重要。通用分词工具仅提供基本支持,通常难以满足特定领域或行业的特殊需求。例如,在处理法律文件时,“不可抗力”、“合同履行”等专业术语可能未被纳入通用词汇库。这可能导致检索结果出现偏差或遗漏关键信息。如果分词不够精确,则返回的结果将无法全面覆盖用户的查询意图,从而影响用户体验。

为了提高分词精度与检索效率,jieba分词器提供了自定义分词词典的功能。您可以根据所在行业或特定应用场景的需求,在词典中添加专有名词、行业术语甚至最新流行词语等,从而实现更符合实际需求的文本分割。本文介绍如何配置并使用属于您的个性化词典。

版本限制

内核版本为7.2.0.1及以上的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'), '永和服装饰品有限公司');