1. 前言

在这篇文章中,介绍了PostgreSQL的全文检索系统,里面有提到,PostgreSQL默认是不支持中文的。看下面的例子。

rails365_pro=# SELECT '号'::tsquery @@ '2015 - Rails365 Inc. All rights reserved. | 粤ICP备15004902号-2'::tsvector;
 ?column? 
----------
 f
(1 row)

rails365_pro=# SELECT '粤ICP备15004902号'::tsquery @@ '2015 - Rails365 Inc. All rights reserved. | 粤ICP备15004902号-2'::tsvector;
 ?column? 
----------
 t
(1 row)

说明没有按照我们的意愿分词,我们可以自己来看看PostgreSQL是怎么分词的。只要用to_tsvector这个指令就好了。

rails365_pro=# SELECT to_tsvector('english', '2015 - Rails365 Inc. All rights reserved. | 粤ICP备15004902号-2');
                                   to_tsvector                                   
---------------------------------------------------------------------------------
 '-2':8 '2015':1 'inc':3 'rails365':2 'reserv':6 'right':5 '粤icp备15004902号':7
(1 row)

明显不符合我们的意愿。"粤icp备15004902号"应该被更详细的切分的。至少把"icp","号“等分开。

我们用一个中文切词的网站来演示一下。网址是http://www.xunsearch.com/scws/demo/v48.php。

它切好的词大概是这样的。

2015 - Rails 365 Inc . All rights reserved . | 粤 ICP 备 15004902 号 - 2 

每个词都是以空格分开的。这样才是比较符合的。所以我们需要一款中文分词的PostgreSQL插件。

2. 安装

zhparser是一款中文分词的PostgreSQL插件。我使用过,效果不错,故推荐。

zhparser只是一个PostgreSQL扩展插件,它是基于SCWS的(一个简易中文分词系统,Simple Chinese Word Segmentation)。

2.1 第一步,安装SCWS
# 下载并解压
wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2 | tar xvjf -
# 编译安装
cd scws-1.2.2 ; ./configure ; sudo make install
2.2 第二步,编译和安装zhparser
# 先安装PostgreSQL的扩展包
sudo apt-get install postgresql-server-dev-9.3
git clone https://github.com/amutu/zhparser.git
cd zhparser
SCWS_HOME=/usr/local make && sudo make install
2.3 第三步,进入数据库安装扩展
# 进入数据库
sudo -u postgres psql
# 连接数据库
\c rails365_pro
# 安装扩展
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;

3. 使用

接下来我们来测试一下,是不是按照我们的意愿来分词。

postgres=# SELECT to_tsvector('testzhcfg','2015 - Rails365 Inc. All rights reserved. | 粤ICP备15004902号-2');
                                         to_tsvector                                                   
----------------------------------------------------------------------------------------------------------------
 '15004902':10 '2':12 '2015':1 '365':3 'all':5 'icp':8 'inc':4 'rails':2 'reserved':7 'rights':6 '号':11 '备':9
(1 row)

果然,切好词了。

还可以这样使用。

postgres=# SELECT * FROM ts_parse('zhparser', '2015 - Rails365 Inc. All rights reserved. | 粤ICP备15004902号-2');
 tokid |  token   
-------+----------
   101 | 2015
   117 | -
   101 | Rails
   101 | 365
   101 | Inc
   117 | .
   101 | All
   101 | rights
   101 | reserved
   117 | .
   117 | |
   106 | 粤
   101 | ICP
   118 | 备
   101 | 15004902
   110 | 号
   117 | -
   101 | 2
(18 rows)

既然能够中文切词,我们就可以方便地结合其他技术来实现一个带中文支持的检索系统的。

完结。

下一篇:PostgreSQL 的全文检索系统之 pg_search 实现 (四)


书籍推荐