本文为您介绍 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 '计算所':6jiebamp | '中国科学院':6 '明':2 '毕业':4 '硕士':3 '计算所':7jiebahmm | '中国':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。