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

pg_jieba

最近更新时间:2026-09-16 11:44:01
我的收藏
本文为您介绍 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 result
UNION ALL
SELECT 'jiebamp', to_tsvector('jiebamp', '小明硕士毕业于中国科学院计算所')::text
UNION ALL
SELECT '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 TABLE
postgres=> INSERT INTO articles VALUES
(1, '小明硕士毕业于中国科学院计算所'),
(2, 'PostgreSQL是开源的关系型数据库'),
(3, '腾讯云数据库支持全文检索');
INSERT 0 3
postgres=> CREATE INDEX idx_articles_body ON articles USING gin (to_tsvector('jiebacfg', body));
CREATE INDEX
postgres=> 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 为纯词典分词,人名等未登录词会被切散(如“小明”切成“明”)。此类内容请使用 jiebacfgjiebahmm

相关参考