PostgreSQL基于SCWS、Zhparser插件全文检索环境安装
- 提到全文检索,我们会想到Elasticsearch、Lucene等功能强大的搜索引擎,但或许我们仅需要实现一些简单的全站搜索或是字符匹配功能,此时引入Elasticsearch、Lucene搜索引擎或许过于重量,使用这些重量级的搜索引擎得需要性能强悍的服务器,还需要处理数据同步与数据一致性问题。
- PostgreSQL数据库自身具备全文检索功能,PostgreSQL全文检索是通过FTS(FTS(full text search,全文检索)是一个带有一定“智能”的搜索工具包)配置库来支持的,FTS 是 PostgreSQL 原生自带的一个功能模块,不需要单独安装,但是很不幸FTS默认不具备中文配置库
- PostgreSQL自带的parser插件适用于分词比较简单的语言(如英语),按照标点、空格切分语句即可获得有含义的词语,而中文比较复杂,词语之间没有空格分隔,长度也不固定,分词还和语义有关,因此parser不能用来做中文分词
- PostgreSQL提供了多种索引类型,其中有两种索引可以被用来加速全文搜索,GIN(通用倒排索引) 和 GiST 索引类型。如果没有特殊的需求GIN更适合全文检索的索引。
1、centos7源码安装PostgreSQL12
全文检索需要安装scws、zhparser插件,推荐源码安装postgresql避免依赖缺失问题
yum方式安装参考
1.1、前置操作(root用户下操作)
-
如果已存在yum安装的postgresql,提供以下卸载方式
-
# 停止postgresql,此处为注册了服务的停止方式,12版本 systemctl stop postgresql-12 # 卸载 包含postgresql名的程序包 yum remove postgresql* # 删除postgres用户及其对应的用户目录(/home/postgres) userdel -r postgres # 检查是否存在 /usr/psqlXXX文件夹,有的话删除,例如 rm -rf /usr/pgsql-12
-
-
创建用户及用户组
-
这里创建postgres用户是因为启动postgresql仅允许非root用户进行
-
# 创建postgres用户组 groupadd postgres # 创建postgres用户,用户位于postgres组内 useradd -g postgres postgres
-
-
依赖安装
-
yum install gcc yum install readline-devel.x86_64 yum install zlib-devel.x86_64
-
1.2、安装PostgreSQL12(postgres用户下操作)
-
切换到
postgres
用户-
su - postgres
-
-
回到用户目录
-
cd ~
-
-
下载postgresql12源码包
-
wget -c https://ftp.postgresql.org/pub/source/v12.6/postgresql-12.6.tar.gz
-
-
解压到当前目录
-
tar -zxvf postgresql-12.6.tar.gz
-
-
配置及安装
-
# 新建PostgreSQL安装路径下的文件夹(/home/postgres/postgresql) mkdir postgresql # 进入解压后的源码文件夹(/home/postgres/postgresql-12.1) cd postgresql-12.6 # 检查、并配置(--prefix=/home/postgres/postgresql 为配置postgreSQL的安装路径) ./configure --prefix=/home/postgres/postgresql # 编译及安装 make && make install
-
环境变量配置
-
vim ~/.bash_profile
-
#postgresql安装目录 PGHOME=/home/postgres/postgresql #postgresql数据存储目录 PGDATA=/home/postgres/PGDATA PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin export PATH
-
-
重载
.bash_profile
-
source ~/.bash_profile
-
-
-
postgresql
数据库初始化-
# /home/postgres/PGDATA为postgres数据文件的存放路径 initdb -D /home/postgres/PGDATA
-
-
启动
-
# /home/postgres/PGDATA为数据文件存放路径,里面也有一些配置文件 pg_ctl -D /home/postgres/PGDATA -l logfile start #配置postgresql数据存储路径环境变量后用以下简化命令代替 pg_ctl start
-
-
停止
-
pg_ctl -D /home/postgres/PGDATA -l logfile stop #配置postgresql数据存储路径环境变量后用以下简化命令代替 pg_ctl stop
-
-
重启
-
pg_ctl -D /home/postgres/PGDATA -l logfile restart #配置postgresql数据存储路径环境变量后用以下简化命令代替 pg_ctl restart
-
-
查看状态
-
pg_ctl -D /home/postgres/PGDATA -l logfile status #配置postgresql数据存储路径环境变量后用以下简化命令代替 pg_ctl status
-
2、中文分词环境安装
- centos7
- postgresql 12
- 全文索引的实现要靠
postgresql
的gin
索引。分词功能postgresql
L 内置了英文、西班牙文等,但中文分词需要借助开源插件zhparser
2.1、SCWS
要使用
zhparser
,首先需要安装SCWS
分词库,SCWS
是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统)GitHub
-
前置条件
-
bzip2
-
yum -y install bzip2
-
-
gcc
编译器-
yum -y install gcc
-
-
wget
-
yum -y install wget
-
-
-
取得 scws 源码并解压
-
wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 | tar xjf -
-
-
进入源码目录配置和编译
-
cd scws-1.2.3 ; ./configure ; make install
-
2.2、Zhparser
zhparser是PostgreSQL的中文分词插件,安装后可以使PostgreSQL支持中文的全文检索 GitHub
-
前置条件
-
git
-
yum -y install git
-
-
-
下载zhparser源码
-
git clone https://github.com/amutu/zhparser.git
-
-
编译和安装zhparser
-
make && make install
-
至此postgresql
中文检索插件安装完毕
3、postgresql中文检索配置
-
登录
postgresql
启用zhparser
插件-
CREATE EXTENSION zhparser;
-
-
创建使用
zhparser
作为解析器的全文搜索的配置-
-- 就是需要给zhparser解析器取一个在sql里面可以使用的名称,一下“zh”则为名称 CREATE TEXT SEARCH CONFIGURATION zh (PARSER = zhparser);
-
-
添加token映射
-
ALTER TEXT SEARCH CONFIGURATION zh ADD MAPPING FOR n,v,a,i,e,l WITH simple;
-
4、全文检索使用
4.1、索引创建
create index idx_name on table_name using gin(to_tsvector('zh', field_name));
4.2、查询
SELECT * FROM table_name WHERE to_tsvector('zh', field_name) @@ 'keyword';