postgres中zhparser和jieba分词器和rum docker镜像的构建与使用

基于SCWS、zhparser、jieba、rum的Postgres中文全文搜索镜像

1、构建镜像

构建镜像的Dockerfile为
(tmp是我新建的文件夹)

[root@hadoop tmp]# vim Dockerfile 
FROM postgres:10.2
ENV SCWS_VERSION 1.2.3
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
        echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib" >/etc/apt/sources.list && \
        echo "deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb-src http://mirrors.163.com/debian/ stretch main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >>/etc/apt/sources.list && \
        echo "deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib" >>/etc/apt/sources.list


RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
        gcc g++ libc6-dev cmake make git wget unzip postgresql-server-dev-10 libpq-dev && rm -rf /var/lib/apt/lists/* && \
        mkdir -p /usr/lib/scws/rum && \
        wget -O /usr/lib/scws/scws-${SCWS_VERSION}.tar.bz2 "http://www.xunsearch.com/scws/down/scws-${SCWS_VERSION}.tar.bz2" && \
        wget -O /usr/lib/scws/zhparser.zip "https://github.com/amutu/zhparser/archive/master.zip" && \
        git clone https://github.com/postgrespro/rum /usr/lib/scws/rum && \
        git clone https://github.com/jaiminpan/pg_jieba /usr/lib/scws/pg_jieba && \
        chown -R postgres.postgres /usr/lib/scws/rum/ && \
        tar xjf /usr/lib/scws/scws-${SCWS_VERSION}.tar.bz2 -C /usr/lib/scws/ && \
        unzip /usr/lib/scws/zhparser.zip -d /usr/lib/scws/ && \
        rm -rf /usr/lib/scws/scws-${SCWS_VERSION}.tar.gz /usr/lib/scws/zhparser.zip && \
        cd /usr/lib/scws/scws-1.2.3 && \
        ./configure && \
        make install && \
        cd /usr/lib/scws/zhparser-master && \
        SCWS_HOME=/usr/local make && make install 

RUN     /sbin/ldconfig -v && \ 
        chown -R postgres.postgres /usr/lib/postgresql && \
        chown -R postgres.postgres /usr/share/postgresql && \
        chown -R postgres.postgres /usr/include/postgresql && \
        cd /usr/lib/scws/pg_jieba && \
        git submodule update --init --recursive && \
        mkdir /usr/lib/scws/pg_jieba/build && \
        cd /usr/lib/scws/pg_jieba/build &&\ 
        cmake -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/10/server .. && \
        make && make install  && \
        apt-get purge -y --auto-remove ca-certificates cmake wget unzip && \
        rm -rf /usr/lib/scws/scws* /usr/lib/scws/zhparser* /usr/lib/scws/pg_jieba
 [root@hadoop tmp]# cat Dockerfile #查看

生成镜像postgres-scws:latest

[root@hadoop tmp]# docker build -t postgres-scws .

[root@hadoop tmp]# docker images | grep postgres-scws
postgres-scws                                              latest              89cb6bdc8748        28 minutes ago      664MB

2、使用镜像

首先在当前目录下新建config目录和sql目录

[root@hadoop tmp]# mkdir config sql

生成用户自定义配置文件

[root@hadoop tmp]# docker run -i --rm postgres-scws cat /usr/share/postgresql/postgresql.conf.sample > config/postgresql.conf

自定义配置文件,在文件末尾添加SCWS的zhparser用户自定义词典配置信息

[root@hadoop tmp]# echo -e "zhparser.extra_dicts = 'labeldic.xdb'\nzhparser.dict_in_memory = 'true'" >>  config/postgresql.conf 
[root@hadoop tmp]# tail config/postgresql.conf 
#include = 'special.conf'               # include file


#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

# Add settings for extensions here
zhparser.extra_dicts = 'labeldic.xdb'
zhparser.dict_in_memory = 'true'

在文件夹sql下,创建数据库初始化shell脚本

[root@hadoop tmp]# cat sql/init.sh 
#!/bin/bash - 
#===============================================================================
#
#          FILE: init.sh 
# 
#         USAGE: ./init.sh  
# 
#   DESCRIPTION: 当镜像启动时,运行脚本生成用户自定义词典的xdb文件及安装postgres的
#                rum模块
#       CREATED: 08/21/2018 05:00:38 PM
#===============================================================================

set -o nounset                              # Treat unset variables as an error
scws-gen-dict -i  /usr/share/postgresql/10/tsearch_data/labeldic.txt -o /usr/share/postgresql/10/tsearch_data/labeldic.xdb -c utf-8 > /dev/null 2>&1
cd /usr/lib/scws/rum
make USE_PGXS=1
make USE_PGXS=1 install
make USE_PGXS=1 installcheck

目录结构信息为

[root@hadoop tmp]# tree
.
├── config
│   └── postgresql.conf
├── Dockerfile
├── labeldic.txt
└── sql
    └── init.sh

2 directories, 4 files

启动postgres-scws:latest实例

[root@hadoop tmp]# docker run -it --name postgresql -p 5432:5432 -v "$PWD/sql/":/docker-entrypoint-initdb.d/ -v "$PWD/config/postgresql.conf":/etc/postgresql/postgresql.conf -v "$PWD/labeldic.txt":/usr/share/postgresql/10/tsearch_data/labeldic.txt -e POSTGRES_PASSWORD=tatt -e POSTGRES_DB=tatt -e POSTGRES_USER=tatt -d postgres-scws:latest  -c config_file=/etc/postgresql/postgresql.conf 
faa15042fd503ef5f2fb4b6a399331cfa948d6d856bd38ad08da2b601759daeb

验证

[root@hadoop tmp]# docker-enter faa15042fd50
mesg: ttyname failed: Success
root@faa15042fd50:~# su postgres
$ psql -U tatt -d tatt
could not change directory to "/root": Permission denied
psql (10.2 (Debian 10.2-1.pgdg90+1))
Type "help" for help.

tatt=# create extension zhparser; 
CREATE EXTENSION
tatt=# create extension pg_jieba;
CREATE EXTENSION
tatt=# create extension rum;
CREATE EXTENSION
tatt=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
CREATE TEXT SEARCH CONFIGURATION
tatt=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l,t WITH simple;
ALTER TEXT SEARCH CONFIGURATION
tatt=# SELECT * FROM ts_parse('zhparser', '改变机动车离婚');
 tokid |      token      
-------+-----------------
   110 | 改变机动车
   110 | 离婚
(2 rows)

tatt=# select * from to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造');
                                              to_tsvector                                               
--------------------------------------------------------------------------------------------------------
 '中国科学院':5 '小明':1 '日本京都大学':10 '毕业':3 '深造':11 '硕士':2 '计算所':6
(1 row)

tatt=# select * from rum_ts_distance(to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造') , to_tsquery('计算所'));
 rum_ts_distance 
-----------------
         16.4493
(1 row)

tatt=# 

也可以在docker-swarm中启动
docker stack compose文件为

[root@hadoop tmp]# cat pg-scws.yml 
version: "3.2"
networks:
    cluster:
services:
    pg:
        hostname: db
        image: postgres-scws:latest 
        environment:
            #database we want to use for application
            POSTGRES_PASSWORD: tatt
            POSTGRES_USER: tatt
            POSTGRES_DB: tatt
            
        ports:
            - 5432:5432
        volumes:
            - $PWD/sql/:/docker-entrypoint-initdb.d/
            - $PWD/labeldic.txt:/usr/share/postgresql/10/tsearch_data/labeldic.txt
            - $PWD/config/postgresql.conf:/etc/postgresql/postgresql.conf
            - /etc/localtime:/etc/localtime:ro
        command: postgres -c config_file=/etc/postgresql/postgresql.conf
        networks:
            cluster:
                aliases:
                    - pg

docker swarm中应用的启动

[root@hadoop tmp]# docker stack deploy -c pg-scws.yml pg
Creating network pg_cluster
Creating service pg_pg
[root@hadoop tmp]# docker stack ls 
NAME                SERVICES
pg                  1
[root@hadoop tmp]# docker ps 
CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS               NAMES
fe4fb96ed2e3        postgres-scws:latest              "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        5432/tcp            pg_pg.1.jwq5raxk0webpaewxx0tln6w7
[root@hadoop tmp]# docker ps | grep  pg  #查看启动的容器
[root@hadoop tmp]# docker stack rm  pg   #删除容器
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法:打开scws-1.2.3\win32里的解决方案文件,里面包括了scwszhparser,另外一个是scws的php扩展不用编译 zhparserPostgresql进行文分词的常用扩展,网上的相关资料很多,安装的教程也不少,但大多数是linux的,并没有windows的安装介绍。原因有两个方面,一个是本身像这种数据库服务器一般都是linux系统的,另外一个比较致命,zhparser本身并没提供windows环境下的编译工程,连依赖库scws的readme里也建议在linux环境下使用,或者用cygwin或mingw一类工具。对于博主这种只使用windows环境(其实Postgresql也是刚接触),连makefile也搞不明白的真是头大。好在万变不离其,编译环境只是工具,只要搞清楚个原理(看代码),移植到windows+VS的环境应该也不是难事(当然这个也只是在轻量级的库下面适用)。下面进入正题: 干货在这里 ① 编译scws:由于 zhparser是基于scwsscws是简易文分词系统的缩写,它的原理其实很简单,基于词典,将文本的内容按照词典进行分词,提取关键字等。)做的分词,因此先要编译scws,网上下载下来的源码有vs2008的版本,因此,直接编译,后来出现头文件无法加入的错误,将相关文件编码方式修改成unicode解决(利用notepad++ 编码->转换为UTF-8编码)。 ② 编译zhparser:由于zhparser只提供了linux下面的makefile文件,想着用Mingw去编译,后来因为postgresql所在目录有空格,导致编译过程也失败。只好到vs2008里自建一个工程,建好工程后,首先把scws的头文件和库文件加进去,然后把postgresql的头文件和库文件加进去,设置项目属性为生成dll文件。 ③ 扩展安装:编译成功以后,在postgresql下面运行:create extension zhparser; 提示找不到control文件,在下载的源码文件夹里找到该文件,放到指定目录,再次运行sql,提示找不到dll文件,将dll文件放到指定目录,再运行,提示找不到zhprs_start函数,看来是dll没有正常explort出函数,修改源代码的相关函数声明,再次运行后,显示成功。但zhparser源文件下其实还有很多文件,包括一个词典文件和ini配制文件,还不知道应该放在何处。 ④ zhparser运行环境配制:运行测试sql语句,发现并没有实现分词,想起来应该是词典位置不正确,到zhparser源码去搜寻,发现如下代码,看来是放到tsearch_data目录下面,用同样的方法找到ini文件的目录,将它们都放进去,再次运行测试代码,得到正确结果。 测试代码: REATE EXTENSION zhparser; -- make test configuration using parser CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser); ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple; select to_tsvector('testzhcfg','南京市长江大桥');
以下是制作单机版docker镜像的步骤: 1. 下载PostgreSQL 12的离线安装包,可以从官方网站下载:https://www.postgresql.org/download/ 2. 创建一个新的文件夹,用于存放dockerfile和postgresql安装包。 3. 在文件夹创建一个名为“dockerfile”的文件,并将以下代码复制到文件: ``` FROM ubuntu:18.04 # 安装依赖 RUN apt-get update && \ apt-get install -y gnupg2 wget # 导入PG的PGDG仓库的公钥 RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - # 添加PGDG仓库 RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" > /etc/apt/sources.list.d/pgdg.list # 安装PostgreSQL RUN apt-get update && \ apt-get install -y postgresql-12 # 创建PG数据文件夹 RUN mkdir -p /usr/local/pgsql/data # 设置PG用户和组 RUN groupadd pgsql && \ useradd -r -g pgsql pgsql # 更改PG数据文件夹的权限 RUN chown -R pgsql:pgsql /usr/local/pgsql # 设置环境变量 ENV PATH="/usr/lib/postgresql/12/bin:${PATH}" ENV PGDATA=/usr/local/pgsql/data # 暴露端口 EXPOSE 5432 # 启动命令 CMD ["postgres"] ``` 4. 将下载的postgresql安装包复制到文件夹。 5. 打开终端,进入到文件夹,执行以下命令来构建docker镜像: ``` docker build -t postgresql12 . ``` 其postgresql12是镜像的名称,可以自己定义。 6. 构建成功后,可以使用以下命令来启动docker容器: ``` docker run --name postgresql12 -d -p 5432:5432 postgresql12 ``` 其postgresql12是镜像的名称,可以自己定义。5432是PostgreSQL的默认端口,可以根据需要进行修改。 7. 启动成功后,可以使用以下命令来查看容器是否运行: ``` docker ps ``` 8. 如果容器正在运行,可以使用以下命令来进入容器: ``` docker exec -it postgresql12 bash ``` 9. 进入容器后,可以使用以下命令来连接PostgreSQL: ``` psql -U postgres ``` 10. 使用以下命令来退出PostgreSQL容器: ``` \q exit ``` 至此,单机版docker镜像制作完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值