postgresql 安装使用

安装环境

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;  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容