热门搜索:
ghcr.io/abcfy2/zhparser

ghcr.io/abcfy2/zhparser:15

ghcr.iolinux/amd6415大小: 未知更新于 2026年6月6日
让 AI 帮你使用轩辕镜像?

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

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

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

https://xuanyuan.cloud/agents.md

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

查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AIDeepSeek 的深度思考模式,不推荐豆包 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

用户好评

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

用户头像

oldzhang

运维工程师

Linux服务器

5

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

官方公众号:源码跳动官方技术交流群:51517718