中文分词(zhparser)

RDS PostgreSQL支持zhparser插件,用于中文的全文检索。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

前提条件

  • 实例大版本为RDS PostgreSQL 10或以上版本。

  • 实例内核小版本为20230830或以上。

    重要

    20230830内核小版本之前已支持此插件,但为了规范插件管理,提升RDS PostgreSQL在插件侧的安全防护,RDS计划在内核版本迭代中陆续对部分存在安全风险的插件进行优化,部分插件在低内核小版本无法创建,更多信息,请参见【产品/功能变更】RDS PostgreSQL限制创建插件说明

    • 如果您的实例内核小版本低于20230830,且已经使用了此插件,则不影响使用。

    • 如果您首次创建或重新创建此插件,请升级内核小版本到最新。

  • 使用该插件前,需要将zhparser加入到shared_preload_libraries参数中。

    您可以使用RDS PostgreSQL参数设置功能,为shared_preload_libraries参数添加zhparser。具体操作,请参见设置实例参数

背景信息

PostgreSQL自带的parser插件适用于分词比较简单的语言(如英语),按照标点、空格切分语句即可获得有含义的词语,而中文比较复杂,词语之间没有空格分隔,长度也不固定,分词还和语义有关,因此parser不能用来做中文分词,建议您使用zhparser。

zhparser是PostgreSQL的中文分词插件,安装后可以使PostgreSQL支持中文的全文检索(Full Text Search)。

启用中文分词

可以使用下面的命令,启用中文分词:

CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
--可选的参数设定
ALTER ROLE CURRENT_ROLE SET zhparser.multi_short=on;
--简单测试
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了 保 障 房 的 建 设 和 投 入 力 度 。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。');
SELECT to_tsvector('testzhcfg','“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。”陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');
SELECT to_tsquery('testzhcfg', '保障房资金压力');

利用分词进行全文索引的方法如下:

--为t1表的name字段创建全文索引,需要将SQL语句中的表名(t1)和字段(name)替换为实际业务中的表名和字段值。
CREATE index idx_t1 ON t1 using gin (to_tsvector('testzhcfg',upper(name) ));
--使用全文索引
 SELECT * FROM t1 WHERE to_tsvector('testzhcfg',upper(t1.name)) @@ to_tsquery('testzhcfg','(防火)') ;

自定义中文分词词典

自定义中文分词词典,示例如下:

-- 初始的分词结果
SELECT to_tsquery('testzhcfg', '保障房资金压力');
-- 往自定义分词词典里面插入新的分词
INSERT INTO pg_ts_custom_word VALUES ('保障房资');
-- 使新的分词生效
SELECT zhprs_sync_dict_xdb();
-- 退出此连接
\c
-- 重新查询,可以得到新的分词结果
SELECT to_tsquery('testzhcfg', '保障房资金压力');

使用自定义分词的注意事项如下:

  • 最多支持一百万条自定义分词,超出部分不做处理,必须保证分词数量在这个范围之内。自定义分词与缺省的分词词典将共同产生作用。

  • 每个词的最大长度为128字节,超出部分将会截取。

  • 增删改分词之后必须执行SELECT zhprs_sync_dict_xdb();并且重新建立连接才会生效。