写点什么

Postgresql 中的检索: 中文分词及语义检索

  • 2025-06-22
    吉林
  • 本文字数:2004 字

    阅读完需:约 7 分钟

Postgresql中的检索:中文分词及语义检索

一 前言

在上一篇文章中提到,在 postgresql 中,使用 pgvector 可以实现向量存储和检索,使用 pg_trgm 基于三元组文本模糊匹配相似度计算,结合 GIN 索引GiST 索引实现全文检索。但 pg_trgm 并不是一个专业的中文分词工具,它是基于字符层面的处理,不理解语义。而且在未安装 zhparser 等分词插件的情况下,执行 SELECT show_trgm('中文测试');时会发现结果为空,因此需要结合 zhparser、jiebaR,或使用 ElasticSearch 等插件或工具实现中文分词/全文检索。

本篇是对 postgresql 的延伸,所以先介绍基于 zhparser 的分词实现,本文基于 macos 操作系统。

二 zhparser 插件安装

2.1 安装 SCWS 分词库(zhparser 的依赖)

wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2tar xvjf scws-1.2.3.tar.bz2cd scws-1.2.3
# 编译安装./configure --prefix=/usr/localmake && sudo make install
# 验证安装scws -v # 应输出版本信息
# 在我本机上,输出的版本信息如下:scws (scws-cli/1.2.3: Simpled Chinese Words Segment - Command line usage)
复制代码

2.2 安装 zhparser

这次采用源码安装方法,从 github 下载源码。

git clone https://github.com/amutu/zhparser.gitcd zhparser
# 设置 PostgreSQL 的 pg_config 路径(通常如下)export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
#编译安装make && sudo make install
复制代码

2.3 在 PostgreSQL 中启用插件

# 连接到 PostgreSQLpsql -U your_username -d your_database
#创建扩展CREATE EXTENSION zhparser;
复制代码

2.4 验证安装


-- 验证解析器SELECT oid, prsname FROM pg_ts_parser WHERE prsname = 'zhparser';
-- 2. 创建配置CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser);ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n, v, a, i, e, l, j, d, t WITH simple;
-- 3. 测试SELECT to_tsvector('chinese_zh', '上海自来水来自海上');-- '上海':1 '来自':3 '自来水':2
-- 4. 设为默认(可选)ALTER DATABASE postgres SET default_text_search_config = 'chinese_zh';
复制代码

三 下载并配置中文词典

zhparser 的词典文件主要来源于 SCWS(Simple Chinese Word Segmentation)中文分词库,以下是获取词典的途径和方法:

3.1 词典下载

3.1.1 从 SCWS 官方下载

zhparser 是基于 SCWS 实现的,因此可以直接从 SCWS 官网下载词典文件:

3.1.2 从 zhparser 的 GitHub 仓库获取

zhparser 的 GitHub 项目可能包含词典文件的示例或指引:

3.1.3 自定义词典

如果需要更专业的词典(如行业术语、新词),可以:

  • 手动构建词典:使用 SCWS 提供的工具 scws-gen-dict 生成自定义词典。

  • 下载第三方词典:如搜狗词库、百度词库等,并转换为 SCWS 支持的 .xdb

3.1.4 云服务或发行版提供的词典

某些 PostgreSQL 发行版(如 KingbaseES、阿里云 PostgreSQL)可能已经集成 zhparser 并附带词典,可直接使用。

3.2 词典安装使用

3.2.1 PostgreSQL 默认安装目录

在某些 PostgreSQL 发行版中,词典文件可能已经预装在以下目录:

  • /usr/share/postgresql/<version>/tsearch_data/

  • /usr/local/share/postgresql/tsearch_data/可以检查这些路径是否已有 dict.utf8.xdb 和 rules.utf8.ini

如果是使用 brew 安装的 postgresql,路径有所不同。以我安装的 postgresql16 为例,预装的词典文件在目录:/opt/homebrew/Cellar/postgresql@16/16.9/share/postgresql@16/tsearch_data/dict.utf8.xdb。

3.2.2 设置词典文件位置

  1. 将词典文件(如 dict.utf8.xdbrules.utf8.ini 等)复制到上述目录

  2. 或者通过参数指定词典路径:

ALTER SYSTEM SET zhparser.dict_in_memory = 'off';  -- 从文件加载ALTER SYSTEM SET zhparser.dict_file_path = '/path/to/your/dict.utf8.xdb';
复制代码

3.2.3 常用配置参数

-- 设置分词精细度ALTER SYSTEM SET zhparser.multi_short = true;  -- 短词ALTER SYSTEM SET zhparser.multi_duality = true;  -- 二元ALTER SYSTEM SET zhparser.multi_zmain = true;  -- 重要单字ALTER SYSTEM SET zhparser.multi_zall = false;  -- 全部单字
-- 忽略标点符号ALTER SYSTEM SET zhparser.punctuation_ignore = true;
-- 是否启用同义词ALTER SYSTEM SET zhparser.synonyms_ignore = false;
复制代码

3.2.4 重新加载配置

SELECT pg_reload_conf();-- 测试分词效果SELECT ts_debug('chinese', '这是一个测试句子');
复制代码

3.3 自定义词典

如果需要使用自定义词典:

  1. 准备词典文件(.xdb 格式)

  2. 将文件放在指定目录

  3. 通过 zhparser.dict_file_path 参数指定路径

注意:修改配置后需要重启 PostgreSQL 服务或重新加载配置才能生效。


发布于: 2025-06-22阅读数: 6
用户头像

磨炼中成长,痛苦中前行 2017-10-22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
Postgresql中的检索:中文分词及语义检索_postgresql_程序员架构进阶_InfoQ写作社区