# 3. 全文检索系统之中文支持 #### 1. 前言 ![](https://box.kancloud.cn/2c36790f8ff338416b87a8b4f6d0d683_206x80.png) 在这篇文章中,介绍了[PostgreSQL的全文检索系统](http://www.rails365.net/articles/postgresql-de-quan-wen-jian-suo-xi-tong),里面有提到,**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。](http://www.xunsearch.com/scws/demo/v48.php%E3%80%82) 它切好的词大概是这样的。 ``` 2015 - Rails 365 Inc . All rights reserved . | 粤 ICP 备 15004902 号 - 2 ``` 每个词都是以空格分开的。这样才是比较符合的。所以我们需要一款中文分词的PostgreSQL插件。 #### 2. 安装 [zhparser](https://github.com/amutu/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 实现 (四)](https://www.rails365.net/articles/postgresql-quan-wen-jian-suo-xi-tong-pg-search-shi-xian-xian-si)