为已有数据的 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 的容器和镜像也没啥用了,可以直接清除掉