在上一篇文章中提到,在postgresql中,使用pgvector可以实现向量存储和检索,使用pg_trgm基于三元组文本模糊匹配和相似度计算,结合GIN 索引和GiST索引实现全文检索。但pg_trgm并不是一个专业的中文分词工具,它是基于字符层面的处理,不理解语义。而且在未安装zhparser等分词插件的情况下,执行SELECT show_trgm('中文测试');时会发现结果为空,因此需要结合zhparser、jiebaR,或使用ElasticSearch等插件或工具实现中文分词/全文检索。
本篇是对postgresql的延伸,所以先介绍基于zhparser的分词实现,本文基于macos操作系统。
wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2
tar xvjf scws-1.2.3.tar.bz2
cd scws-1.2.3
# 编译安装
./configure --prefix=/usr/local
make && 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.git
cd zhparser
# 设置 PostgreSQL 的 pg_config 路径(通常如下)
export PATH="/opt/homebrew/opt/postgresql@16/bin:$PATH"
#编译安装
make && sudo make install
2.3 在 PostgreSQL 中启用插件
# 连接到 PostgreSQL
psql -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)中文分词库,以下是获取词典的途径和方法:
zhparser 是基于 SCWS 实现的,因此可以直接从 SCWS 官网下载词典文件:
zhparser 的 GitHub 项目可能包含词典文件的示例或指引:
如果需要更专业的词典(如行业术语、新词),可以:
scws-gen-dict
生成自定义词典。.xdb
。某些 PostgreSQL 发行版(如 KingbaseES、阿里云 PostgreSQL)可能已经集成 zhparser 并附带词典,可直接使用。
在某些 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。
dict.utf8.xdb
、rules.utf8.ini
等)复制到上述目录ALTER SYSTEM SET zhparser.dict_in_memory = 'off'; -- 从文件加载
ALTER SYSTEM SET zhparser.dict_file_path = '/path/to/your/dict.utf8.xdb';
-- 设置分词精细度
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 自定义词典
如果需要使用自定义词典:
zhparser.dict_file_path
参数指定路径注意:修改配置后需要重启 PostgreSQL 服务或重新加载配置才能生效。