云数据库 PostgreSQL pg_jieba

这篇说说pg_jieba中文全文检索分词插件,基于jieba引擎提供多种分词策略,支持在腾讯云PostgreSQL中实现中文分词、全文索引与检索,推荐使用jiebacfg配置。 – 分词配置:提供jiebacfg(推荐)、jiebamp、jiebahmm、jiebaqry四种策略,分别适用于不同场景。 – 全文索引:通过GIN索引与@@操作符,支持对中文文本进行高效全文检索。 – 常见问题:jiebacfg兼顾准确率。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

这里说明 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 产品文档

赞 (0)
上一篇 4天前
下一篇 4天前