配置自定义分词词典
在全文检索过程中,分词的准确性对于检索结果至关重要。通用分词工具仅提供基本支持,通常难以满足特定领域或行业的特殊需求。例如,在处理法律文件时,“不可抗力”、“合同履行”等专业术语可能未被纳入通用词汇库。这可能导致检索结果出现偏差或遗漏关键信息。如果分词不够精确,则返回的结果将无法全面覆盖用户的查询意图,从而影响用户体验。
为了提高分词精度与检索效率,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');
将词典加载到内存后,还需要按顺序完成以下两个步骤,方能使自定义词典对现有数据生效。
已有的数据库会话连接需要断开并重新连接。
更新词典不会影响已写入到表中的数据。如果希望词典对已有数据生效必须重建索引。
使用词典创建索引
在创建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'), '永和服装饰品有限公司');