
abcfy2/zhparser基于zhparser的PostgreSQL中文全文搜索Docker镜像,用于实现PostgreSQL数据库的中文分词与全文检索功能。本镜像从chen-xin/docker_zhparser fork而来,并已升级至新版本。
| 标签 | Dockerfile链接 |
|---|---|
| latest | Dockerfile.debian |
| 17 | Dockerfile.debian |
| 16 | Dockerfile.debian |
| 15 | Dockerfile.debian |
| 14 | Dockerfile.debian |
| 13 | Dockerfile.debian |
| alpine | Dockerfile.alpine |
| 17-alpine | Dockerfile.alpine |
| 16-alpine | Dockerfile.alpine |
| 15-alpine | Dockerfile.alpine |
| 14-alpine | Dockerfile.alpine |
| 13-alpine | Dockerfile.alpine |
注:标签中的数字对应PostgreSQL官方镜像版本。
适用于需要在PostgreSQL中实现中文全文检索的场景,如:
参考PostgreSQL官方镜像文档,基础运行命令如下:
bashdocker run -p 5432:5432 abcfy2/zhparser
容器首次启动时,需在默认数据库中执行以下SQL脚本配置zhparser。对于新创建的数据库,需手动执行相同脚本:
sql-- 创建zhparser扩展 CREATE EXTENSION zhparser; -- 创建文本搜索配置(名称可自定义,如"chinese_zh") CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser); -- 添加分词类型映射(n:名词, v:动词, a:形容词等) ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR n,v,a,i,e,l WITH simple;
配置说明:
- "chinese_zh"为自定义配置名称,可按需修改
- "n,v,a,i,e,l"为分词类型,未映射的类型将不参与文档分词。使用
\dFp+ zhparser可查看zhparser支持的所有分词类型
sqlselect ts_debug('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
输出示例:
txtts_debug ------------------------------------------- (t,time,白垩纪,{},,) (v,verb,是,{simple},simple,{是}) (n,noun,地球,{simple},simple,{地球}) (n,noun,上海,{simple},simple,{上海}) (m,numeral,陆,{},,) (v,verb,分布,{simple},simple,{分布}) (c,conjunction,和,{},,) (n,noun,生物界,{simple},simple,{生物界}) (d,adverb,急剧,{},,) (v,verb,变化,{simple},simple,{变化}) (u,auxiliary,、,{},,) (n,noun,火山,{simple},simple,{火山}) (v,verb,活动,{simple},simple,{活动}) (a,adjective,频繁,{simple},simple,{频繁}) (u,auxiliary,的,{},,) (n,noun,时代,{simple},simple,{时代}) (16 rows)
sqlselect to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
输出示例:
txtto_tsvector -------------------------------------------------------------------------------------------- '上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9 (1 row)
注:若需包含"白垩纪",需添加
t类型映射:ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR t WITH simple;
sql-- 判断"地球"是否在文本中 select to_tsquery('chinese_zh', '地球') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
输出示例:
txt?column? ---------- t (1 row)
sql-- 创建测试表 create table testing( title text ); -- 插入测试数据 insert into testing values('白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代'); insert into testing values('艾泽拉斯包括卡利姆多、东部王国两大大陆,暗夜精灵主城达纳苏斯位于东部王国北端。'); -- 创建GIN索引(基于中文全文搜索配置) create index ind_testing on testing using gin (to_tsvector('chinese_zh', title));
sql-- 搜索包含"白垩纪"的记录 select * from testing where to_tsquery('chinese_zh', '白垩纪') @@ to_tsvector('chinese_zh', title); -- 搜索包含"达纳苏斯"的记录 select * from testing where to_tsquery('chinese_zh', '达纳苏斯') @@ to_tsvector('chinese_zh', title);
注:若表数据量较少,PostgreSQL可能选择顺序扫描而非索引扫描。当数据量达到数万级时,GIN索引将显著提升查询性能。
/usr/share/postgresql/<version>/tsearch_data/,文件名可自定义,如mydict.utf8.txt):txt# 格式:word TF IDF ATTR(TF/IDF为权重,ATTR为分词类型) 艾泽拉斯 1 1 n 卡利姆多 1 1 n 达纳苏斯 1 1 n 遗忘海岸 1 1 n
postgresql.conf,添加词典路径:confzhparser.extra_dicts = 'mydict.utf8.txt'
sqlselect ts_debug('chinese_zh', '艾泽拉斯');
输出示例:
txt(n,noun,艾泽拉斯,{simple},simple,{艾泽拉斯})
XDB格式为二进制词典,性能优于TXT格式,步骤如下:
bash# 进入词典目录 cd /usr/share/postgresql/<version>/tsearch_data/ # 生成XDB词典(需确保scws-gen-dict工具可用) ldconfig # 解决可能的库依赖问题 scws-gen-dict -c UTF8 mydict.utf8.txt mydict.utf8.xdb # 修改文件权限(确保postgres用户可访问) chown postgres:postgres mydict.utf8.xdb
bashsed -i 's/mydict\.utf8\.txt/mydict.utf8.xdb/' /var/lib/postgresql/data/postgresql.conf






manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务