这里说明 pg_jieba 插件的简介及使用方法。
一、概述
pg_jieba 是中文全文检索分词插件,基于 jieba 分词引擎,提供多种分词策略的文本搜索解析器,适用于中文内容的全文索引与检索场景。
二、支持版本
| PostgreSQL 版本 | 内核版本 |
| PostgreSQL 11 | v11.22_r1.22及以上 |
| PostgreSQL 12 | v12.20_r1.25及以上 |
| PostgreSQL 13 | v13.16_r1.20及以上 |
| PostgreSQL 14 | v14.13_r1.28及以上 |
| PostgreSQL 15 | v15.8_r1.14及以上 |
| PostgreSQL 16 | v16.4_r1.8及以上 |
| PostgreSQL 17 | v17.10_r1.22及以上 |
| PostgreSQL 18 | v18.1_r1.5及以上 |
注意:说明:
注意:你可在控制台实例详情页查看当前实例的内核版本,或执行 SHOW tencentdb_version; 查询。
三、插件简介
pg_jieba 提供基于 jieba 的中文分词解析器,并内置多种分词策略对应的文本搜索配置。扩展创建后即可直接使用 jiebacfg 等配置进行中文分词、全文索引和检索。
四、加载插件
pg_jieba 是需要预加载的插件,使用前请先在控制台参数设置的 shared_preload_libraries 参数中勾选 pg_jieba,保存后重启实例。
五、创建扩展
连接到需要使用的数据库,执行以下语句创建扩展:
postgres=> CREATE EXTENSION pg_jieba;CREATE EXTENSION
六、分词配置
pg_jieba 提供以下文本搜索配置:
| 配置 | 分词策略 | 说明 |
| jiebacfg | Mix(词典 + HMM) | 兼顾准确率与新词识别,推荐使用 |
| jiebamp | MP(最大概率) | 纯词典分词,不识别词典外新词 |
| jiebahmm | HMM | 基于 HMM 模型,可识别新词,切分更碎 |
| jiebaqry | Query | Mix 基础上全切分,适合搜索引擎类查询 |
七、中文分词
使用 to_tsvector 对中文文本分词并向量化:
postgres=> SELECT to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所'); to_tsvector—————————————————– '中国科学院':5 '小明':1 '毕业':3 '硕士':2 '计算所':6(1 row)
文本被正确切分为“小明、硕士、毕业、中国科学院、计算所”等词。
三种分词策略的效果对比:
postgres=> SELECT 'jiebacfg' AS cfg, to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所')::text AS resultUNION ALLSELECT 'jiebamp', to_tsvector('jiebamp', '小明硕士毕业于中国科学院计算所')::textUNION ALLSELECT 'jiebahmm', to_tsvector('jiebahmm', '小明硕士毕业于中国科学院计算所')::text; cfg | result—————+———————————————————– jiebacfg | '中国科学院':5 '小明':1 '毕业':3 '硕士':2 '计算所':6 jiebamp | '中国科学院':6 '明':2 '毕业':4 '硕士':3 '计算所':7 jiebahmm | '中国':4 '小明':1 '毕业于':3 '硕士':2 '科学院':5 '计算':6(3 rows)
注意:说明:
注意:jiebacfg 将“小明”识别为一个词;jiebamp 因纯词典缺少人名“小明”而切分为“明”;jiebahmm 切分更碎(“中国”、“科学院”、“计算”)。
八、构造查询条件
使用 to_tsquery 构造检索条件:
postgres=> SELECT to_tsquery('jiebacfg', '中国科学院计算所'); to_tsquery——————————– '中国科学院' <-> '计算所'(1 row)
<-> 表示相邻短语匹配,即文档中“中国科学院”和“计算所”相邻时才命中。
九、查看分词详情
使用 ts_debug 查看每个词及其词性:
postgres=> SELECT alias, token FROM ts_debug('jiebacfg', '小明硕士毕业于中国科学院计算所'); alias | token——-+———— x | 小明 n | 硕士 n | 毕业 p | 于 nt | 中国科学院 n | 计算所(6 rows)
注意:说明:
注意:alias 为词性(n 名词、v 动词、nt 机构名等),便于按词性做精细控制。
十、建立全文索引与检索
对中文文本列建立 GIN 索引,并进行全文检索:
postgres=> CREATE TABLE articles (id int, body text);CREATE TABLEpostgres=> INSERT INTO articles VALUES (1, '小明硕士毕业于中国科学院计算所'), (2, 'PostgreSQL是开源的关系型数据库'), (3, '腾讯云数据库支持全文检索');INSERT 0 3postgres=> CREATE INDEX idx_articles_body ON articles USING gin (to_tsvector('jiebacfg', body));CREATE INDEXpostgres=> SELECT id, body FROM articles WHERE to_tsvector('jiebacfg', body) @@ to_tsquery('jiebacfg', '中国科学院'); id | body—-+———————————– 1 | 小明硕士毕业于中国科学院计算所(1 row)
注意:说明:
注意:使用 @@ 操作符匹配,查询命中包含“中国科学院”的文档。
十一、Q:jiebacfg 与 jiebamp、jiebahmm 如何选择?
A:大多数场景推荐 jiebacfg(Mix 策略),它兼顾词典准确率与新词识别;jiebamp 速度快但不识别词典外新词;jiebahmm 善于发现新词但切分较碎,可能影响召回精度。
十二、Q:为什么检索“小明”时 jiebamp 配置查不到?
A:jiebamp 为纯词典分词,人名等未登录词会被切散(如“小明”切成“明”)。此类内容请使用 jiebacfg 或 jiebahmm。
十三、相关参考
pg_jieba 产品文档