帮你快速理解、总结文档立即下载

zhparser

最近更新时间:2026-09-16 11:44:01
我的收藏
本文为您介绍 zhparser 插件的简介及使用方法。

概述

zhparser 是中文全文检索分词插件,基于 SCWS 分词引擎,提供中文文本搜索解析器与自定义词库能力,适用于中文内容的全文索引与检索场景。

支持版本

PostgreSQL 版本
内核版本
PostgreSQL 10
v10.23_r1.20及以上
PostgreSQL 11
v11.22_r1.35及以上
PostgreSQL 12
v12.22_r1.37及以上
PostgreSQL 13
v13.22_r1.32及以上
PostgreSQL 14
v14.22_r1.42及以上
PostgreSQL 15
v15.14_r1.27及以上
PostgreSQL 16
v16.10_r1.22及以上
PostgreSQL 17
v17.9_r1.16及以上
PostgreSQL 18
v18.3_r1.6及以上
说明:
您可在控制台实例详情页查看当前实例的内核版本,或执行 SHOW tencentdb_version; 查询。

插件简介

zhparser 基于 SCWS 引擎提供中文分词解析器。与内置分词配置即用的插件不同,zhparser 创建后需先创建文本搜索配置并指定词性映射,再进行分词与检索;同时支持通过自定义词库添加业务专有名词。

环境准备

在目标数据库中执行以下语句创建扩展:
postgres=> CREATE EXTENSION zhparser;
CREATE EXTENSION
说明:
zhparser 无需预加载;扩展会创建 zhparser 模式,其中包含自定义词表 zhparser.zhprs_custom_word

创建分词配置

使用 zhparser 解析器创建文本搜索配置,并为常见词性配置字典映射:
postgres=> CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
CREATE TEXT SEARCH CONFIGURATION
postgres=> ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
ALTER TEXT SEARCH CONFIGURATION
说明:
ADD MAPPING FOR n,v,a,i,e,l 表示将名词(n)、动词(v)、形容词(a)、成语(i)、感叹词(e)、习用语(l)等词性映射到 simple 字典(小写化处理),标点等其他词性将被忽略。

中文分词

使用创建的配置对中文文本分词:
postgres=> SELECT to_tsvector('testzhcfg', '保障房资金压力');
to_tsvector
-----------------------------------
'保障':1 '压力':4 '房':2 '资金':3
(1 row)
构造检索条件:
postgres=> SELECT to_tsquery('testzhcfg', '保障房资金压力');
to_tsquery
---------------------------------------------
'保障' <-> '房' <-> '资金' <-> '压力'
(1 row)

查看分词与词性

使用 ts_parse 直接查看解析器的分词结果与词性代码:
postgres=> SELECT * FROM ts_parse('zhparser', '保障房资金压力');
tokid | token
-------+-------
118 | 保障
110 |
110 | 资金
110 | 压力
(4 rows)
说明:
tokid 为词性代码(110名词 n、118动词 v、120未知词 x 等),可据此调整配置的词性映射范围。

自定义词库

默认词典无法识别业务专有名词时(如“保障房”被切分为“保障”和“房”),可通过自定义词库添加词条。

添加词条并同步

postgres=> INSERT INTO zhparser.zhprs_custom_word VALUES ('保障房');
INSERT 0 1
postgres=> SELECT sync_zhprs_custom_word();
sync_zhprs_custom_word
------------------------

(1 row)
说明:
sync_zhprs_custom_word 将词表同步到词典文件;需要重新建立数据库连接后新词才生效

为新词配置词性映射

重新连接后,自定义词默认识别为未知词(x),需为其补充映射:
postgres=> ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR x WITH simple;
ALTER TEXT SEARCH CONFIGURATION
postgres=> SELECT to_tsvector('testzhcfg', '保障房资金压力');
to_tsvector
-----------------------------------
'保障房':1 '压力':3 '资金':2
(1 row)
说明:
添加映射后,“保障房”作为完整词条保留在分词结果中。若要让自定义词直接按名词处理,可在词表中将词条的 attr 字段设为 @(默认值,表示添加)之外的策略,或按上述方式为 x 词性建立映射。

删除词条

在词表中将词条的 attr 字段置为 !(即使主词典有该词也失效),再执行同步并重连:
postgres=> INSERT INTO zhparser.zhprs_custom_word(word, attr) VALUES ('某词', '!');

建立全文索引与检索

postgres=> CREATE TABLE news (id int, content text);
CREATE TABLE
postgres=> INSERT INTO news VALUES (1, '保障房资金压力测试文本');
INSERT 0 1
postgres=> CREATE INDEX idx_news_content ON news USING gin (to_tsvector('testzhcfg', content));
CREATE INDEX
postgres=> SELECT id, content FROM news WHERE to_tsvector('testzhcfg', content) @@ to_tsquery('testzhcfg', '保障房 & 资金');
id | content
----+------------------------
1 | 保障房资金压力测试文本
(1 row)
说明:
& 表示 AND 匹配,检索同时包含“保障房”和“资金”的文档。

参数说明

zhparser 的分词行为参数如下,会话级参数可随时 SET 调整:
参数
默认值
级别
说明
zhparser.multi_short
off
会话级
短词复合
zhparser.multi_duality
off
会话级
散字二元复合
zhparser.multi_zmain
off
会话级
重要单字复合
zhparser.multi_zall
off
会话级
全部单字复合
zhparser.punctuation_ignore
off
会话级
忽略标点符号
zhparser.seg_with_duality
off
会话级
闲散文字自动二元分词
zhparser.dict_in_memory
off
连接级
词典全部加载到内存
zhparser.extra_dicts
连接级
额外词典文件列表
说明:
连接级参数(dict_in_memoryextra_dicts)需在建立连接前设置。

常见问题

Q:为什么自定义词库添加词条后检索仍无变化?

A:请确认已完成三个步骤:执行 sync_zhprs_custom_word() 同步、重新建立数据库连接、为自定义词的词性(默认 x)在配置中添加映射。

Q:如何让某个词不再参与分词?

A:在 zhparser.zhprs_custom_word 中插入该词并将 attr 设为 !,执行同步并重连后,该词将被从词典中剔除。

相关参考