美文网首页
postgresql 安装使用

postgresql 安装使用

作者: 走在成长的道路上 | 来源:发表于2021-10-18 11:01 被阅读0次

    安装环境

    OS: Ubuntu 20.04.3
    

    PostgreSQL 服务安装

    # 防止版本问题先清理所有历史版本
    $ sudo apt purge postgresql*
    
    # 安装
    $ sudo apt-get  upgrade
    $ sudo apt install postgresql postgresql-contrib postgresql-client postgresql-plpython3
    
    # 配置 postgresql.conf 远程访问
    $ diff /etc/postgresql/12/main/postgresql.conf
    - # listen_addresses = 'localhost'
    + listen_addresses = '*'
    
    # 配置 postgresql.conf 远程访问
    $ diff /etc/postgresql/12/main/pg_hba.conf
    -  host   all  all    127.0.0.1/32   md5
    + host   all  all     0.0.0.0/0        md5
    
    # 查看服务状态
    $ sudo systemctl start postgresql
    $ sudo systemctl enable postgresql
    $ sudo systemctl status postgresql
    
    # 安装 plpython 插件
    $ sudo -u postgres psql
    # 创建插件 plpython3u
    postgres=# CREATE EXTENSION plpython3u;
    # 查询支持的插件列表
    postgres=# select * from pg_language;
      oid  |  lanname   | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl 
    -------+------------+----------+---------+--------------+---------------+-----------+--------------+--------
        12 | internal   |       10 | f       | f            |             0 |         0 |         2246 | 
        13 | c          |       10 | f       | f            |             0 |         0 |         2247 | 
        14 | sql        |       10 | f       | t            |             0 |         0 |         2248 | 
     13455 | plpgsql    |       10 | t       | t            |         13452 |     13453 |        13454 | 
     16388 | plpython3u |       10 | t       | f            |         16385 |     16386 |        16387 | 
    (5 rows)
    
    # 测试 python 插件
    postgres=# create function pymax (a integer, b integer)
    returns integer
    as $$
        if a > b:
            return a
        return b
    $$ language plpython3u;
    
    # 执行查询操作
    postgres=# select pymax(1,2);
    
    # 测试依赖库
    postgres=# create or replace function to_tsv(i_text text) returns tsvector as $$    
       import jieba
       seg_list = jieba.cut(i_text, cut_all=True);
       return("".join(seg_list))
    $$ language plpython3u;
    
    # 执行查询操作
    postgres=# select to_tsv('我爱北京天安门');
    

    创建用户

    # 创建用户 dev
    $ sudo -u postgres createuser --superuser dev
    
    # 配置 dev 用户密码
    # 进入
    $ sudo -u postgres psql
    \password dev
    \q
    
    # 创建 ctest 数据库
    $ sudo -u postgres createdb ctest --owner=dev
    
    # 登录数据库
    $ psql -U dev -d ctest -h 127.0.0.1 -p 5432
    Password for user dev: 
    psql (12.8 (Ubuntu 12.8-0ubuntu0.20.04.1), server 10.14 (Ubuntu 10.14-0ubuntu0.18.04.1))
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    ctest=#
    

    pljava 安装

    1. 同步 pljava 代码并编译
    # 同步 pljava 代码
    git clone https://github.com/tada/pljava
    
    # 切换到 V1_5_0(当前 java 版本为 1.8), 1.6.x 版本都是 10 以上的 jdk 版本
    git checkout V1_5_0
    
    # 编译执行
    mvn clean install
    
    # 查看 pg 配置目录
    pg_config
    PKGLIBDIR = /usr/lib/postgresql/12/lib
    SHAREDIR = /usr/share/postgresql/12
    
    # 安装 pljava.so 库到 PKGLIBDIR 目录下
    sudo cp ./pljava-so/target/nar/pljava-so-1.5.0-SNAPSHOT-i386-Linux-gpp-shared/lib/i386-Linux-gpp/shared/libpljava-so-1.5.0-SNAPSHOT.so \
      /usr/lib/postgresql/12/lib/pljava.so
    
    # 安装 pljava.jar 库到 SHAREDIR/extension 目录下
    sudo cp ./pljava/target/pljava-1.5.0-SNAPSHOT.jar /usr/share/postgresql/12/extension/pljava--1.5.0.jar
    
    sudo cp ./src/sql/install.sql /usr/share/postgresql/12/extension/pljava--1.5.0.sql
    
    # 配置 java 环境, 在 pljava--1.5.0.sql 中添加如下两行
    SET PLJAVA.CLASSPATH='/usr/share/postgresql/9.4/extension/pljava--1.4.4.jar';
    SET PLJAVA.VMOPTIONS='-Xms64M -Xmx128M';
    
    # 添加 `pljava.control` 文件
    $ cat /usr/share/postgresql/12/extension/pljava.control
    # pljava extension
    comment = 'PL/Java bundled as an extension'
    default_version = '1.5.0'
    relocatable = false
    
    1. 配置 pljava 插件
    # 创建插件
    CREATE EXTENSION pljava;
    
    # 查看支持的 java 语言内容
    SELECT * FROM pg_language WHERE lanname LIKE 'java%';
    
    # 删除插件
    DROP EXTENSION pljava;
    

    pg_jieba 安装

    1. 编译 pg_jieba 代码
    # 安装 pg dev 包
    sudo apt install postgresql-server-dev-12 libpq-dev -y
    
    # 同步 pg_jieba 代码
    git clone git clone https://github.com/jaiminpan/pg_jieba
    git clone https://github.com/jaiminpan/pg_jieba
    cd pg_jieba/
    git submodule update --init --recursive
    mkdir build
    cd build
    cmake -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/12/server/ ..
    make
    sudo make install
    
    1. 配置 pg_jieba 插件
    CREATE EXTENSION pg_jieba;
    
    1. 测试 pg_jieba
    # 以 to_tsquery 的方式进行查询
    select * from to_tsquery('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。');
    
    # 以 ts_debug 的方式进行查询
    select * from ts_debug('jiebacfg', '是拖拉机学院手扶拖拉机专业的。不用多久,我就会升职加薪,当上CEO,走上人生巅峰。');
    

    安装 smlar 插件

    作为文本相似的查询,常见插件有 smlarpg_similarity, 这里以 smlar 为例进行测试

    1. 编译安装插件
    # 同步代码
    git clone git://sigaev.ru/smlar.git  
    
    # 编译执行
    cd smlar  
    
    # 使用 pg_config 进行配置
    export USE_PGXS=1 
    
    # 编译执行 
    make  
    
    # 安装
    sudo make install  
    

    安装时会出现异常,注释掉 Makefile 中如下即可

    #ifdef USE_PGXS
    PG_CONFIG = pg_config
    PGXS := $(shell $(PG_CONFIG) --pgxs)
    include $(PGXS)
    #else
    #subdir = contrib/smlar
    #top_builddir = ../..
    #include $(top_builddir)/src/Makefile.global
    #include $(top_srcdir)/contrib/contrib-global.mk
    #endif
    
    1. 构建词频表
    # 添加文本相似度插件 smlar, 含索引方式实现
    create extension smlar; 
    
    # 建表
    create table documents_body_stats (  
      value text unique,  
      ndoc int not null  
    ); 
    
    # 导入词频数据(这里可以创建物化视图,每日刷新即可)
    insert into documents_body_stats  
      select  word,  ndoc  
      from ts_stat( 'select to_tsvector(''simple'', body) from documents' ); 
    
    # 插入文档数量
    insert into documents_body_stats values  (null, (select count(*) from documents) );  
    
    1. 配置 smlar.conf
    • 在配置文件中进行配置

    postgres.conf 文件中,我们看到 include_dir = 'conf.d' 表示将所有 conf.d 目录下的 .conf 后缀的文件,添加到配置

    $ cat /etc/postgresql/12/main/conf.d/smlar.conf
    smlar.persistent_cache true   
    smlar.stattable 'documents_body_stats'  
    smlar.type 'tfidf'  
    smlar.idf_plus_one true  
    smlar.tf_method 'const'  
    smlar.threshold 0.5 
    
    • 在使用过程中同样能修改
    SET smlar.stattable TO 'documents_body_stats'  
    

    配置文件的方式进行配置需要进行重启服务sudo systemctl restart postgresql

    1. 插件测试
    select smlar(tsvector2textarray(to_tsvector('jiebacfg','黑猩猩每年都在增长')), tsvector2textarray(to_tsvector('jiebacfg','黑猩猩和人类很接近 readface')))
    
    # 查询 `电力发展快速` 相似度高的文章
    select  
      *,  
      smlar( tsvector2textarray(tcsv), tsvector2textarray(to_tsvector('jiebacfg','电力发展快速')) )  
    from  
      tbl_news 
    where  
      smlar( tsvector2textarray(tcsv), tsvector2textarray(to_tsvector('jiebacfg','电力发展快速')) )   > 0.1
    order by  
      smlar( tsvector2textarray(tcsv), tsvector2textarray(to_tsvector('jiebacfg','电力发展快速')) )   desc  
    limit 10; 
    
    1. 海明距离计算优化
    # 构建海明测试表
    create table hm4 (id int, hmval bit(64), hmarr text[]);  
    # 构建 gin 索引,gin 索引具有块级收敛,二重过滤
    create index idx_hm1 on hm1 using gin(hmarr _text_sml_ops );  
    
    # 配置 smlar 类型为 overlap 
    set smlar.type = overlap;
    
    # 构建自动拆分函数
    create or replace function sp(val bit(64)) returns text[] as $$
    select regexp_split_to_array('1_'||substring(val::text,1,10)||',2_'||substring(val::text,11,10)||',3_'||substring(val::text,21,10)||',4_'||substring(val::text,31,10)||',5_'||substring(val::text,41,10)||',6_'||substring(val::text,51,14), ',') ;            
    $$ language sql strict;
    
    # 插入数据
    insert into hm4 (id, hmval) values (1, 123::bit(64));
    
    # 插入 bit(64) 数据,使用 cast 语句进行转换,可用于java插入语句
    insert into hm4 (id, hmval) values(1, cast(1233 as bit(64)))
    
    # 构建触发器函数
    create or replace function tg() returns trigger as $$
    declare
    begin
      NEW.hmarr := sp(NEW.hmval);
      return NEW;
    end;
    $$ language plpgsql strict;
    
    # 添加触发器
    create trigger tg before insert or update on hm4 for each row execute procedure tg();
    
    # 查询优化
    select    
        *,    
        smlar( hmarr, sp(123::bit(64)))     -- 查询与123::bit(64)海明距离小于2的记录
      from    
        hm4  
      where    
        hmarr % sp(123::bit(64))      -- 查询与123::bit(64)海明距离小于2的记录
        and length(replace(bitxor(123::bit(64), hmval)::text,'0','')) < 2      -- 查询与123::bit(64)海明距离小于2的记录
      limit 100;  
    

    相关文章

      网友评论

          本文标题:postgresql 安装使用

          本文链接:https://www.haomeiwen.com/subject/qnagoltx.html