摘要:在上一篇文章中提到,在postgresql中,使用pgvector可以实现向量存储和检索,使用pg_trgm基于三元组文本模糊匹配和相似度计算,结合GIN 索引和GiST索引实现全文检索。但pg_trgm并不是一个专业的中文分词工具,它是基于字符层面的处理,不
在上一篇文章中提到,在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.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 install2.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 实现的,因此可以直接从 SCWS 官网下载词典文件:
SCWS 官方下载地址:http://www.xunsearch.com/scws/download.php ,提供了GBK、UTF8编码的简体中文(dict.utf8.xdb)和UTF8繁体中文词典。zhparser 的 GitHub 项目可能包含词典文件的示例或指引:
zhparser GitHub 地址:https://github.com/amutu/zhparser。其中也提供了dic.utf8.xdb的词典文件。如果需要更专业的词典(如行业术语、新词),可以:
某些 PostgreSQL 发行版(如 KingbaseES、阿里云 PostgreSQL)可能已经集成 zhparser 并附带词典,可直接使用。
在某些 PostgreSQL 发行版中,词典文件可能已经预装在以下目录:
/usr/share/postgresql//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 自定义词典来源:小肖科技每日一讲