为已有数据的 PostgreSQL Docker 镜像安装启用 zhparser 中文分词插件
为已有数据的 PostgreSQL Docker 镜像安装启用 zhparser 中文分词插件
具体场景,目前有个 PostgreSQL 的实例(官方的 alpine 镜像)需要使用中文分词,数据库中已经有不少数据,而且这个 Docker 镜像还关联着其他的工具
如果直接使用 zhparser 的 Docker 镜像,涉及到的环节会比较多,麻烦。
所以想到的方法是:从 zhparser 的 Docker 镜像内,获取到编译好的插件文件,复制到现有的 PostgreSQL 容器内,然后再启用 zhparser 就可以了
查看 zhparser 的 Dockerfile ,发现方案完全可行,开干。
先拉取 zhparser 对应的镜像,跑起来
根据 Dockerfile 获取路径,通过
find
命令获取需要的插件文件列表
docker exec 5ec2ff092387 sh -c 'find /usr/local -type f \( -path "/usr/local/lib/postgresql/zhparser.so" -o -path "/usr/local/lib/libscws.*" -o -path "/usr/local/share/postgresql/extension/zhparser*" -o -path "/usr/local/lib/postgresql/bitcode/zhparser*" -o -path "/usr/local/share/postgresql/tsearch_data/*.utf8.*" \) -print'
将文件复制到宿主机
docker cp 5ec2ff092387:/usr/local/share/postgresql/tsearch_data/rules.utf8.ini ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/tsearch_data/dict.utf8.xdb ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--1.0--2.0.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser.control ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--2.0.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--unpackaged--1.0.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--2.1--2.2.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--2.0--2.1.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--2.1.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/share/postgresql/extension/zhparser--1.0.sql ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/postgresql/bitcode/zhparser.index.bc ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/postgresql/bitcode/zhparser.bc ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/postgresql/zhparser.so ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/libscws.so.1 ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/libscws.so ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/libscws.so.1.1.0 ~/zhparser_workspace docker cp 5ec2ff092387:/usr/local/lib/libscws.la ~/zhparser_workspace
将宿主机内的文件复制到目标容器内的对应目录内
docker cp ~/zhparser_workspace/rules.utf8.ini 31819ce8de59:/usr/local/share/postgresql/tsearch_data/ docker cp ~/zhparser_workspace/dict.utf8.xdb 31819ce8de59:/usr/local/share/postgresql/tsearch_data/ docker cp ~/zhparser_workspace/zhparser--1.0--2.0.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser.control 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--2.0.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--unpackaged--1.0.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--2.1--2.2.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--2.0--2.1.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--2.1.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser--1.0.sql 31819ce8de59:/usr/local/share/postgresql/extension/ docker cp ~/zhparser_workspace/zhparser.index.bc 31819ce8de59:/usr/local/lib/postgresql/bitcode/ docker cp ~/zhparser_workspace/zhparser.bc 31819ce8de59:/usr/local/lib/postgresql/bitcode/ docker cp ~/zhparser_workspace/zhparser.so 31819ce8de59:/usr/local/lib/postgresql/ docker cp ~/zhparser_workspace/libscws.so.1 31819ce8de59:/usr/local/lib/ docker cp ~/zhparser_workspace/libscws.so 31819ce8de59:/usr/local/lib/ docker cp ~/zhparser_workspace/libscws.so.1.1.0 31819ce8de59:/usr/local/lib/ docker cp ~/zhparser_workspace/libscws.la 31819ce8de59:/usr/local/lib/
PostgreSQL 启用 zhparser 插件,然后测试一下
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动');
没毛病,正常
确定一切正常之后,zhparser 的容器和镜像也没啥用了,可以直接清除掉