# 3. 全文檢索系統之中文支持
#### 1. 前言

在這篇文章中,介紹了[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)