PostgreSQL支持全文检索,其内置的缺省的分词解析器采用空格分词。因为中文的词语之间没有空格分割,所以这种方法并不适用于中文。要支持中文的全文检索需要额外的中文分词插件。网上查了下,可以给PG用的开源中文分词插件有两个:nlpbamboo和zhparser。但是nlpbamboo是托管在googlecode上的,而googlecode被封了,下载不方便。下面尝试采用zhparser进行中文的全文检索。
zhparser是基于Simple Chinese Word Segmentation(SCWS)中文分词库实现的一个PG扩展,作者是 amutu,源码URL为https://github.com/amutu/zhparser。
1. 安装
1.1 下载SCWS
http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2
1.2 编译和安装SCWS
tar xvf scws-1.2.2.tar.bz2
cd scws-1.2.2
./configure
make install
1.3 下载zhparser
https://github.com/amutu/zhparser/archive/master.zip
1.4 编译和安装zhparser
确保PostgreSQL的二进制命令路径在PATH下,然后解压并进入zhparser目录后,编译安装zhparser。
SCWS_HOME=/usr/local make && make install
2 配置中文全文检索
连接到目标数据库进行中文全文检索的配置
2.1 安装zhparser扩展
点击(此处)折叠或打开
-bash-4.1$ psql testdb
psql (9.4.0)
Type "help" for help.
testdb=# create extension zhparser;
CREATE EXTENSION
安装zhparser扩展后多一个叫“zhparser”的解析器
点击(此处)折叠或打开
testdb=# \dFp
List of text search parsers
Schema | Name | Description
------------+----------+---------------------
pg_catalog | default | default word parser
public | zhparser |
(2 rows)
zhparser可以将中文切分成下面26种token
点击(此处)折叠或打开
testdb=# select ts_token_type('zhparser');
ts_token_type
-----------------------------------------
(97,a,adjective)
(98,b,"differentiation (qu bie)")
(99,c,conjunction)
(100,d,adverb)
(101,e,exclamation)
(102,f,"position (fang wei)")
(103,g,"root (ci gen)")
(104,h,head)
(105,i,idiom)
(106,j,"abbreviation (jian lue)")
(107,k,head)
(108,l,"tmp (lin shi)")
(109,m,numeral)
(110,n,noun)
(111,o,onomatopoeia)
(112,p,prepositional)
(113,q,quantity)
(114,r,pronoun)
(115,s,space)
(116,t,time)
(117,u,auxiliary)
(118,v,verb)
(119,w,"punctuation (qi ta biao dian)")
(120,x,unknown)
(121,y,"modal (yu qi)")
(122,z,"status (zhuang tai)")
(26 rows)
2.2 创建使用zhparser作为解析器的全文搜索的配置
点击(此处)折叠或打开
testdb=# CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
CREATE TEXT SEARCH CONFIGURATION
2.3 往全文搜索配置中增加token映射
点击(此处)折叠或打开
testdb=# ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
ALTER TEXT SEARCH CONFIGURATION
上面的token映射只映射了名词(n),动词(v),形容词(a),成语(i),叹词(e)和习用语(l)6种,这6种以外的token全部被屏蔽。词典使用的是内置的simple词典,即仅做小写转换。根据需要可以灵活定义词典和token映射,以实现屏蔽词和同义词归并等功能。
3.中文分词测试
点击(此处)折叠或打开
testdb=# select to_tsvector('testzhcfg','南京市长江大桥');
to_tsvector
-------------------------
'南京市':1 '长江大桥':2
(1 row)
中文分词有最大匹配,最细粒度等各种常用算法。上面的分词结果没有把'长江大桥'拆成'长江'和'大桥'两个词,所以SCWS估计是采取的最大匹配的分词算法。
分词算法的优劣一般通过3个指标衡量。
效率:
索引和查询的效率
召回率&#x