开始
安装
首先是安装 PgSQL,这里我使用的是 PgSQL 9.6,PgSQL 10 也刚发布了,有兴趣的可以尝下鲜。
PgSQL 的安装可以说非常复杂了,除了要安装 Server 和 Client 外,还需要安装 devel 包。为了实现空间索引功能,我们还要安装最重要的 PostGIS 插件,此插件需要很多依赖,自己手动安装非常复杂而且很可能出错。
推荐自动化方式安装,Yum 一定要配合 epel 这样的 Yum 源,保障能将依赖一网打尽。当然最好的还是使用 docker 来运行,找个镜像就行了。
插件
由于 PgSQL 的很多功能都由插件实现,所以还要安装一些常用的插件,如:
postgis_topology(管理面、边、点等拓扑对象)
pgrouting(路径规划)
postgis_sfcgal(实现3D相关算法)
fuzzystrmatch(字符串相似度计算)
address_standardizer/address_standardizer_data_us(地址标准化)
pg_trgm(分词索引)
这些插件在安装目录 /path/extensions 下编译完毕后,在数据库中使用前要先使用 create extension xxx 启用。
启动
1.切换到非 root 用户。(PgSQL 在安装完毕后会创建一个名为 postgres 的超级用户,我们可以使用这个超级用户来操作 PgSQL,后期建议重新创建一个普通用户用来管理数据);
2.切换到 /installPath/bin/ 目录下,PgSQL 在此目录下提供了很多命令,如 createdb、createuser、dropdb、pg_dump 等;
3.使用 createdb 命令初始化一个文件夹 dir_db (此目录不能已存在)存放数据库物理数据,使用 -E UTF8 参数指定数据库字符集为 utf-8;
4.使用 pg_ctl -D dir_db 指定数据库启动后台服务;
5.使用 psql -d db 在命令行登陆 PgSQL;
配置
安装完毕后还要配置一些比较基本的参数才能正常使用。
Host权限
PgSQL需要在 pg_hba.conf 文件中配置数据库 Host 权限,才能被其他机器访问。
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 md5
host all all 172.16.0.1/16 md5
文件中注释部分对这几个字段介绍得比较详细, 我们很可能需要添加 host(IP) 访问项, ADDRESS 是普通的网段表示法,METHOD 推荐使用 md5,表示使用 md5 加密传输密码。
服务器配置
服务器配置在 postgresql.conf中,修改配置后需要 使用 pg_ctl restart -D dir_db 命令重启数据库;
此外,我们也可以在登陆数据库后修改配置项:使用 SELECT * FROM pg_settings WHERE name = ‘config’; 查询当前配置项,再使用 UPDATE 语句更新配置。但有些配置如内存分配策略是只在当前 session 生效的,全局生效需要在配置文件中修改,再重启服务器。
我们可以修改配置并用客户端验证 SQL 语句的优化,使用 timing on 开启查询计时,使用 EXPLAIN ANALYSE 语句 分析查询语句效率。 下面介绍两个已实践过的配置参数:
- shared_buffers:用于指定共享内存缓冲区所占用的内存量。它应该足够大来存储常使用的查询结果,以减少物理I/O。但它也不能太大,以避免系统 内存swap 的发生, 一般设置为系统内存的 20%。
- work_mem:一个连接的工作内存,在查询结果数据量较大时,此值如果较小的话,会导致大量系统 I/O,导致查询速度急剧下降,如果你的 explain 语句内 buffer 部分 read数值过大,则表示工作内存不足,需要调整加此参数。但此值也不能太大,需要保证 work_mem * max_connections + shared_buffers + 系统内存 < RAM,不然同样可能会导致系统 内存swap。
这样,PgSQL 就能作为一个正常的关系型数据使用了。
分词
全文索引的实现要靠 PgSQL 的 gin 索引。分词功能 PgSQL 内置了英文、西班牙文等,但中文分词需要借助开源插件 zhparser;
SCWS
要使用 zhparser,我们首先要安装 SCWS 分词库,SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统),其 GitHub 项目地址为 hightman-scws,我们下载之后可以直接安装。
安装完后,就可以在命令行中使用 scws 命令进行测试分词了, 其参数主要有:
- -c utf8 指定字符集
- -d dict 指定字典 可以是 xdb 或 txt 格式
- -M 复合分词的级别, 1~15,按位异或的 1|2|4|8 依次表示 短词|二元|主要字|全部字,默认不复合分词,这个参数可以帮助调整到最想要的分词效果。
zhpaser
1.下载 zhparser 源码 git clone https:github.com/amutu/zhparser.git;
2.安装前需要先配置环境变量:export PATH=$PATH:/path/to/pgsql;
3.make && make install编译 zhparser;
4.登陆 PgSQL 使用 CREATE EXTENSION zhparser; 启用插件;
5.添加分词配置
CREATE TEXT SEARCH CONFIGURATION parser_name (PARSER = zhparser); // 添加配置
ALTER TEXT SEARCH CONFIGURATION parser_name ADD MAPPING FOR n,v,a,i,e,l,j WITH simple; // 设置分词规则 (n 名词 v 动词等,详情阅读下面的文档)