轩辕镜像 官方专业版
轩辕镜像
专业版
轩辕镜像 官方专业版
轩辕镜像
专业版
首页个人中心搜索镜像
交易
充值流量¥7起我的订单
文档
工具
提交工单页面收录
ghcr.io/abcfy2/zhparser

ghcr.io/abcfy2/zhparser:15

ghcr.iolinux/amd6415大小: 157.92 MB更新于 2026年6月21日
让 AI 帮你使用轩辕镜像? · 展开查看说明 · 点击收起说明

如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。

只需在 AI 对话中先发送下面这句话即可:

请先完整阅读并严格遵守以下文档中的全部规则与要求:

https://xuanyuan.cloud/agents.md

在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。

查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。

Docker Hub | GitHub Container Registry | Quay.io

基于zhparser的PostgreSQL中文全文搜索Docker镜像源码仓库。

Fork自:https://github.com/chen-xin/docker_zhparser%EF%BC%8C%E5%B9%B6%E5%B7%B2%E5%8D%87%E7%BA%A7%E8%87%B3%E6%96%B0%E7%89%88%E6%9C%AC%E3%80%82

支持的标签及对应Dockerfile链接

  • latest
  • alpine
  • 17-alpine
  • 16-alpine
  • 15-alpine
  • 14-alpine
  • 13-alpine

上述数字为PostgreSQL Docker镜像版本。

快速参考

在9版本之前,PostgreSQL官方发行版未内置中文全文搜索功能,需通过第三方扩展实现。

Zhparser基于Xunsearch的Simple Chinese Word Segmentation(SCWS,中文简易分词)开发,在Google搜索“Chinese full-text postgres”时结果最为常见,且近期仍在积极维护。

zhparser xunsearch词典属性说明 https://github.com/aboutstudy/scel2mmseg%22%E6%90%9C%E7%8B%97%E8%AF%8D%E5%85%B8%E8%BD%AC%E6%96%87%E6%9C%AC"

如何使用本镜像

运行本镜像请参考PostgreSQL Docker镜像文档。基本命令为docker run -p 5432:5432 chenxinaz/zhparser。

docker run -p 5432:5432 chenxinaz/zhparser

容器首次运行时,以下脚本会在默认数据库上执行。对于任何新创建的数据库,你需要手动运行这些脚本来配置zhparser:

CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION chinese_zh (PARSER = zhparser);
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,t" 是标记类型,未映射的标记类型不会用于文档分词。使用\dFp+ zhparser列出zhparser生成的所有标记类型。
\dFp+ zhparser

测试

ts_debug:

select ts_debug('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
ts_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)

可以看到解析器存在一些错误:“海陆”未被识别为单个词语。另一个潜在问题是“白垩纪”被识别为“t,time”类型,而zhparser官方文档的示例映射设置中未包含该类型(仅包含'n,v,a,i,e,l'),这会导致新手因该词未被分词而产生困惑。

to_tsvector:

select to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
to_tsvector
--------------------------------------------------------------------------------------------
'上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9
(1 row)

可以看到“白垩纪”未出现在结果中。要包含它,需执行:

ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR t WITH simple;

to_tsquery & plainto_tsquery

select to_tsquery('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select plainto_tsquery('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsquery('chinese_zh', '白垩纪 是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select plainto_tsquery('chinese_zh', '白垩纪 是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
to_tsquery
-----------------------------------------------------------------------------------------
'是' & '地球' & '上海' & '分布' & '生物界' & '变化' & '火山' & '活动' & '频繁' & '时代'
(1 row)

上述所有查询除第3个抛出语法错误外,均产生相同结果。你可以尝试不带'chinese_zh'参数的查询,观察结果变化。

组合查询与向量

select to_tsquery('地球') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsquery('chinese_zh', '地球') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
?column?
.----------
t
(1 row)
select to_tsquery('chinese_zh', '地球上') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
?column?
.----------
f
(1 row)

这个结果出乎意料,即使闭着眼睛也能明显看出“地球上”肯定在“白垩纪是地球上海陆分布..”中,为什么结果是false?让我们深入分析:

select to_tsquery('地球上');
select to_tsquery('chinese_zh', '地球上');
select to_tsvector('白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select ts_debug('chinese_zh', '地球上');
select to_tsvector('chinese_zh', '海陆');
'地球上'
'地球' & '上'
'火山活动频繁的时代':2 '白垩纪是地球上海陆分布和生物界急剧变化':1
'上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9
(n,noun,地球,{simple},simple,{地球})
(v,verb,上,{simple},simple,{上})
'海陆':1

现在可以看到,ts_query '地球' & '上' 无法匹配 ts_vector '上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9。

'地球' & '上'
'上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9

建议的解决方案:

  • 使“地球上”成为优先级高于“上海”的标记(不推荐);
  • 使“海陆”成为优先级高于“上海”的标记;
  • 在表和查询中使用

[!NOTE] 我已添加自定义词典包含“白垩纪”和“达纳苏斯”,详情见下一章。

-- 你可能需要先运行下一行(我尚未测试)
-- CREATE EXTENSION pg_trgm;

create table testing(
title text
);

insert into testing values('白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
insert into testing values('艾泽拉斯包括卡利姆多、东部王国两大大陆,暗夜精灵主城达纳苏斯位于东部王国北端。');
create index ind_testing on testing using gin (to_tsvector('chinese_zh', title));

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);

explain select * from testing where to_tsquery('chinese_zh', '达纳苏斯') @@ to_tsvector('chinese_zh', title);

你可能会困惑为什么最后一条语句显示查询使用的是顺序扫描而非索引扫描,可能有两个原因:

  • 查询字符串太短,PostgreSQL认为匹配行数过多,使用索引得不偿失;
  • 表中行数太少,索引无法带来性能提升。

在我对100,000行表的测试中,结果如下:

Bitmap Heap Scan on doc_pack (cost=23.88..1658.13 rows=500 width=1448) (actual time=18.410..18.411 rows=1 loops=1)
Recheck Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Heap Blocks: exact=1
-> Bitmap Index Scan on ind_doc_pack_title (cost=0.00..23.75 rows=500 width=0) (actual time=18.402..18.402 rows=1 loops=1)
Index Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Planning time: 0.103 ms
Execution time: 18.440 ms
  • 添加自定义词典(txt格式)
    首先使用当前配置测试一些自定义词汇:
select ts_debug('chinese_zh', '艾泽拉斯');
select ts_debug('chinese_zh', '卡利姆多');
select ts_debug('chinese_zh', '达纳苏斯');
select ts_debug('chinese_zh', '遗忘海岸');
select ts_debug('chinese_zh', '艾萨拉');
(n,noun,艾泽,{simple},simple,{艾泽})
(n,noun,拉斯,{simple},simple,{拉斯})

(n,noun,泰达,{simple},simple,{泰达})
(n,noun,希尔,{simple},simple,{希尔})

(v,verb,遗忘,{simple},simple,{遗忘})
(s,space,海岸,{},,)

(n,noun,艾萨,{simple},simple,{艾萨})
(v,verb,拉,{simple},simple,{拉})

在/usr/share/postgresql/9.6/tsearch_data/mydict.utf8.txt中创建自定义词典(你可以使用喜欢的其他名称,但必须放在该目录下):

#word TF IDF ATTR
艾泽拉斯 1 1 n
卡利姆多 1 1 n
泰达希尔 1 1 n
达纳苏斯 1 1 n
多兰纳尔 1 1 n
艾萨拉 1 1 n
遗忘海岸 1 1 n

[!NOTE] 如果词典编码与数据库不同怎么办?
[!NOTE] 根据zhparser文档,词典文件中可以省略TF、IDF、ATTR。如果省略这些,记得执行ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR x WITH simple;,否则新词汇不会被to_tsvector使用,导致无法在查询中搜索到它们。

ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR x WITH simple;

然后修改/var/lib/postgresql/data/posrgresql.conf,在末尾添加以下行:zhparser.extra_dicts = 'mydict.utf8.txt'

/var/lib/postgresql/data/posrgresql.conf
zhparser.extra_dicts = 'mydict.utf8.txt'

如果你使用我的docker镜像azurewind.psqlcnft,默认docker容器中没有vi或nano等编辑器,你可以使用以下命令修改文件:

echo "zhparser.extra_dicts = 'mydict.utf8.txt'"
>> /var/lib/postgresql/data/postgresql.conf

现在重启postgres,再次测试:

select ts_debug('chinese_zh', '艾泽拉斯');
select ts_debug('chinese_zh', '卡利姆多');
select ts_debug('chinese_zh', '达纳苏斯');
select ts_debug('chinese_zh', '遗忘海岸');
select ts_debug('chinese_zh', '艾萨拉');
(n,noun,艾泽拉斯,{simple},simple,{艾泽拉斯})
(n,noun,卡利姆多,{simple},simple,{卡利姆多})
(n,noun,达纳苏斯,{simple},simple,{达纳苏斯})
(n,noun,遗忘海岸,{simple},simple,{遗忘海岸})
(n,noun,艾萨拉,{simple},simple,{艾萨拉})
  • 添加自定义词典(xdb格式)
    根据zhparser文档,xdb格式词典比txt格式更推荐。以下是步骤(在bash中运行):
# 假设当前目录已创建mydict.utf8.txt
cd /usr/share/postgresql/9.6/tsearch_data
# 在我的docker容器中,不运行此命令会导致库文件找不到错误
ldconfig
# 按照scws文档从txt生成xdb词典
scws-gen-dict -c UTF8 mydict.utf8.txt mydict.utf8.xdb
# 测试发现,root拥有的xdb词典对postgresql不可访问
chown postgres:postgres mydict.utf8.xdb
# 更新配置
sed -i 's/mydict\.utf8\.txt/mydict.utf8.xdb/' /var/lib/postgresql/data/postgresql.conf
# 验证配置
tail /var/lib/postgresql/data/postgresql.conf

重启Postgres并按上述方法测试。

  • 其他资源
    发现一个scel2mmseg工具:https://github.com/aboutstudy/scel2mmseg%22%E6%90%9C%E7%8B%97%E8%AF%8D%E5%85%B8%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%96%87%E6%9C%AC"

  • "chinese_zh" 是自定义名称,可根据需要修改。

  • "n,v,a,i,e,l,t" 是标记类型,未映射的标记类型不会用于文档分词。使用 \dFp+ zhparser 可列出 zhparser 生成的所有标记类型。

测试

ts_debug:

select ts_debug('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');

ts_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)

我们可以看到解析器存在一些错误:“海陆”未被识别为单个词语。另一个潜在问题是“白垩纪”被识别为“t,time”类型,而 zhparser 官方文档的示例映射设置中并未包含该类型(仅包含 'n,v,a,i,e,l'),这会导致新手因该词未被分词而产生困惑。

to_tsvector:

select to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');

to_tsvector
--------------------------------------------------------------------------------------------
'上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9
(1 row)

我们可以看到结果中没有“白垩纪”。要将其包含在内,我们需要执行 ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR t WITH simple;

to_tsquery & plainto_tsquery

select to_tsquery('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select plainto_tsquery('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsquery('chinese_zh', '白垩纪 是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select plainto_tsquery('chinese_zh', '白垩纪 是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
to_tsquery
-----------------------------------------------------------------------------------------
'是' & '地球' & '上海' & '分布' & '生物界' & '变化' & '火山' & '活动' & '频繁' & '时代'
(1 row)

上述所有查询产生相同结果,除了第三个查询抛出语法错误。你可以尝试不带 'chinese_zh' 参数的查询,观察结果变化。

组合查询与向量

select to_tsquery('地球') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsquery('chinese_zh', '地球') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
?column?
.----------
t
(1 row)
select to_tsquery('地球上') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsquery('chinese_zh', '地球上') @@ to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
?column?
.----------
f
(1 row)

这个结果出乎意料,即使闭着眼睛也能明显看出“地球上”存在于“白垩纪是地球上海陆分布..”中,为什么结果是 false?让我们深入分析:

select to_tsquery('地球上');
select to_tsquery('chinese_zh', '地球上');
select to_tsvector('白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select to_tsvector('chinese_zh', '白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
select ts_debug('chinese_zh', '地球上');
select to_tsvector('chinese_zh', '海陆');
'地球上'
'地球' & '上'
'火山活动频繁的时代':2 '白垩纪是地球上海陆分布和生物界急剧变化':1
'上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9
(n,noun,地球,{simple},simple,{地球})
(v,verb,上,{simple},simple,{上})
'海陆':1

现在我们可以看到,查询向量 '地球' & '上' 无法匹配文本向量 '上海':3 '分布':4 '变化':6 '地球':2 '时代':10 '是':1 '活动':8 '火山':7 '生物界':5 '频繁':9。

可能的解决方案:

  • 使“地球上”成为优先级高于“上海”的标记(不推荐);
  • 使“海陆”成为优先级高于“上海”的标记;
  1. 在表和查询中使用

[!NOTE] 我已为“白垩纪”和“达纳苏斯”添加了自定义词典,详情见下一章。

-- 你可能需要先运行下一行,我尚未测试
-- CREATE EXTENSION pg_trgm;

create table testing(
title text
);

insert into testing values('白垩纪是地球上海陆分布和生物界急剧变化、火山活动频繁的时代');
insert into testing values('艾泽拉斯包括卡利姆多、东部王国两大大陆,暗夜精灵主城达纳苏斯位于东部王国北端。');
create index ind_testing on testing using gin (to_tsvector('chinese_zh', title));

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);

explain select * from testing where to_tsquery('chinese_zh', '达纳苏斯') @@ to_tsvector('chinese_zh', title);

你可能会困惑为什么最后一条语句显示查询使用的是顺序扫描而非索引扫描,这可能有两个原因:

  1. 查询字符串太短,PostgreSQL 认为匹配的行数过多,使用索引得不偿失;
  2. 表中的行数太少,索引无法带来性能提升。

在我对 100,000 行表的测试中,结果如下:

Bitmap Heap Scan on doc_pack (cost=23.88..1658.13 rows=500 width=1448) (actual time=18.410..18.411 rows=1 loops=1)
Recheck Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Heap Blocks: exact=1
-> Bitmap Index Scan on ind_doc_pack_title (cost=0.00..23.75 rows=500 width=0) (actual time=18.402..18.402 rows=1 loops=1)
Index Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Planning time: 0.103 ms
Execution time: 18.440 ms

对 2,700,000 行表的测试结果如下:

Bitmap Heap Scan on docs (cost=47.12..11533.37 rows=2983 width=2844) (actual time=25.364..25.365 rows=1 loops=1)
Recheck Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Heap Blocks: exact=1
-> Bitmap Index Scan on ind_doc_title (cost=0.00..46.37 rows=2983 width=0) (actual time=25.355..25.355 rows=1 loops=1)
Index Cond: ('''达纳苏斯'''::tsquery @@ to_tsvector('chinese_zh'::regconfig, (title)::text))
Planning time: 19.188 ms
Execution time: 25.392 ms
insert into doc_pack(id, title, no, doc_keeper, archive_type, speciaty)
values ('asdf', '艾泽拉斯包括卡利姆多、东部王国两大大陆,暗夜精灵主城达纳苏斯位于东部王国北端。', 'b1234', 'aa', 'bb', 'cc');

explain analyze select * from doc_pack where to_tsquery('chinese_zh', '达纳苏斯') @@ to_tsvector('chinese_zh', title);

insert into docs(id, file_type, create_time, title, size, uri)
values ('asdf', 'aaa', now(), '艾泽拉斯包括卡利姆多、东部王国两大大陆,暗夜精灵主城达纳苏斯位于东部王国北端。', 0, '');

explain analyze select * from docs where to_tsquery('chinese_zh', '达纳苏斯') @@ to_tsvector('chinese_zh', title);
  1. 添加自定义词典(txt)

首先在当前配置下测试一些自定义词语:

select ts_debug('chinese_zh', '艾泽拉斯');
select ts_debug('chinese_zh', '卡利姆多');
select ts_debug('chinese_zh', '达纳苏斯');
select ts_debug('chinese_zh', '遗忘海岸');
select ts_debug('chinese_zh', '艾萨拉');
(n,noun,艾泽,{simple},simple,{艾泽})
(n,noun,拉斯,{simple},simple,{拉斯})

(n,noun,泰达,{simple},simple,{泰达})
(n,noun,希尔,{simple},simple,{希尔})

(v,verb,遗忘,{simple},simple,{遗忘})
(s,space,海岸,{},,)

(n,noun,艾萨,{simple},simple,{艾萨})
(v,verb,拉,{simple},simple,{拉})

创建客户词典

在 /usr/share/postgresql/9.6/tsearch_data/mydict.utf8.txt 中创建客户词典(您可以使用喜欢的其他名称,但必须放在该目录下):

#word TF IDF ATTR
艾泽拉斯 1 1 n
卡利姆多 1 1 n
泰达希尔 1 1 n
达纳苏斯 1 1 n
多兰纳尔 1 1 n
艾萨拉 1 1 n
遗忘海岸 1 1 n

[!NOTE] 词典编码与数据库编码不同怎么办?

[!NOTE] 根据 zhparser 文档,词典文件中可以省略 TF、IDF、ATTR。如果省略这些字段,请记住执行 ALTER TEXT SEARCH CONFIGURATION chinese_zh ADD MAPPING FOR x WITH simple;,否则新添加的词语不会被 to_tsvector 使用,导致无法在查询中搜索到它们。

然后修改 /var/lib/postgresql/data/postgresql.conf,在文件末尾添加以下行: zhparser.extra_dicts = 'mydict.utf8.txt'

如果您使用我的 Docker 镜像 azurewind.psqlcnft,默认 Docker 容器中没有 vi 或 nano 等编辑器,您可以使用以下命令修改文件: `echo "zhparser.extra_dicts = 'mydict.utf8.txt'"

/var/lib/postgresql/data/postgresql.conf`。

现在重启 postgres,然后再次测试:

select ts_debug('chinese_zh', '艾泽拉斯');
select ts_debug('chinese_zh', '卡利姆多');
select ts_debug('chinese_zh', '达纳苏斯');
select ts_debug('chinese_zh', '遗忘海岸');
select ts_debug('chinese_zh', '艾萨拉');
(n,noun,艾泽拉斯,{simple},simple,{艾泽拉斯})
(n,noun,卡利姆多,{simple},simple,{卡利姆多})
(n,noun,达纳苏斯,{simple},simple,{达纳苏斯})
(n,noun,遗忘海岸,{simple},simple,{遗忘海岸})
(n,noun,艾萨拉,{simple},simple,{艾萨拉})

3. 添加自定义词典(xdb 格式)

根据 zhparser 文档,xdb 格式词典比 txt 格式更推荐。
以下是操作步骤(在 bash 中执行):

# 假设您已在此目录中创建了 mydict.utf8.txt:
cd /usr/share/postgresql/9.6/tsearch_data
# 在我的 Docker 容器中,不执行此命令会导致库未找到错误
ldconfig
# 按照 scws 文档从 txt 生成 xdb 词典
scws-gen-dict -c UTF8 mydict.utf8.txt mydict.utf8.xdb
# 在我的测试中,root 拥有的 xdb 词典对 postgresql 用户不可访问
chown postgres:postgres mydict.utf8.xdb
# 更新配置
sed -i 's/mydict\.utf8\.txt/mydict.utf8.xdb/' /var/lib/postgresql/data/postgresql.conf
# 验证配置
tail /var/lib/postgresql/data/postgresql.conf

重启 Postgres 并按上述方法测试。

4. 其他资源

发现一个 scel2mmseg 工具:
scel2mmseg original

轩辕镜像配置手册

按平台快速找到配置文档

一键安装

一键安装 Docker

Linux Docker 一键安装

AI

用 AI 使用轩辕镜像

agents.md · AI 对话 · 提示词

Docker

登录仓库拉取

登录认证 · 私有仓库

专属域名拉取

免登录 · 高速拉取

Linux

Docker 镜像配置

Windows / Mac

Docker Desktop 配置

MacOS OrbStack

OrbStack 容器

Apple Container

macOS 原生容器

Docker Compose

Compose 项目配置

NAS

群晖

Synology 配置

飞牛

fnOS 镜像配置

绿联

绿联 NAS

威联通

QNAP 配置

极空间

极空间 NAS

Unraid

Unraid NAS

企业仓库

其他仓库

ghcr · Quay · nvcr

Harbor 镜像源

Proxy Repository 对接

Portainer 镜像源

Registries 配置

Nexus 镜像源

Docker Proxy 缓存

开发工具

Dev Containers

VS Code 开发容器

Podman

Podman 配置指南

Singularity / Apptainer

HPC 科学计算容器

Kubernetes

K8s Containerd

Kubernetes · Containerd

K3s

轻量级集群

面板 / 网络

爱快路由

iKuai 镜像加速

宝塔面板

一键配置镜像源

需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单

镜像拉取常见问题

功能

版本功能对比

功能对比 · 版本选择

支持的镜像仓库

Docker Hub · GCR · GHCR

新手拉取配置

登录 · 专属域名 · 配置

docker search 限制

专属域名 · Hub 搜索

不支持 push

仅支持 pull · 不支持

拉取速度原因

带宽 · 缓存 · 冷热镜像

错误码

402 与流量用尽

402 · 流量包 · 充值

401 认证失败

401 · docker login

manifest unknown

标签错误 · 镜像不存在

410 Gone 排查

410 · Docker 升级

429 限流

免费版 · 专业版 · 企业版 · 请求频率

其他报错

DNS 超时

DNS 解析 · 网络超时

TLS 证书失败

no matching manifest(架构)

账号

失败是否计费

manifest · blob · 计费

申请开发票(企业 / 个人)

企业 · 个人 · 工单

修改登录密码

网站 · 仓库 · 重置

注销账户

工单 · 数据 · 注销

原理

mirrors 不生效

daemon.json · 重启

去掉域名前缀

docker tag · 重命名

指定架构拉取

ARM64 · AMD64 · 多架构

latest 与「最新」

digest · 版本号 · 标签

查看全部问题→

用户好评

来自真实用户的反馈,见证轩辕镜像的优质服务

用户头像

oldzhang

运维工程师

Linux服务器

5

"Docker访问体验非常流畅,大镜像也能快速完成下载。"

轩辕镜像
镜像详情
...
ghcr.io/abcfy2/zhparser
教程轩辕镜像功能与使用教程
定价查看流量套餐与价格
热门查看热门 Docker 镜像推荐
博客Docker 镜像公告与技术博客
专业版 · 高速稳定拉取镜像
高速镜像下载·在线技术支持·99.95% SLA 保障·付费会员免广告
50GB 仅 ¥7/年
专业版 · 高速稳定拉取镜像
50GB 仅 ¥7/年
高速镜像下载·在线技术支持·99.95% SLA 保障·付费会员免广告
用户协议·隐私政策·增值电信业务经营许可证:浙B2-20261007·©2024-2026 源码跳动©2024-2026 杭州源码跳动科技有限公司·商务合作:点击复制邮箱