这里说明 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 CONFIGURATIONpostgres=> 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 1postgres=> 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 CONFIGURATIONpostgres=> 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 TABLEpostgres=> INSERT INTO news VALUES (1, '保障房资金压力测试文本');INSERT 0 1postgres=> CREATE INDEX idx_news_content ON news USING gin (to_tsvector('testzhcfg', content));CREATE INDEXpostgres=> 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_memory、extra_dicts)需在建立连接前设置。
十四、Q:为什么自定义词库添加词条后检索仍无变化?
A:请确认已完成三个步骤:执行 sync_zhprs_custom_word() 同步、重新建立数据库连接、为自定义词的词性(默认 x)在配置中添加映射。
十五、Q:如何让某个词不再参与分词?
A:在 zhparser.zhprs_custom_word 中插入该词并将 attr 设为 !,执行同步并重连后,该词将被从词典中剔除。
十六、相关参考
zhparser 产品文档