本文为您介绍 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 设为 !,执行同步并重连后,该词将被从词典中剔除。