1、环境
Fedora 20 + Postgresql 9.3.4 + scws 1.2.2 + zhparser2、安装
2.1 scws
- wget -q -O - http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2• tar xjf - cd scws-1.2.1
- ./configure --prefix=/usr/local #该路径为scws的安装路径
- make install
2.2 zhparser
- git clone https://github.com/amutu/zhparser.git
- SCWS_HOME=/usr/local/scws make && make install
3、配置
4、测试
postgres=# SELECT * FROM ts_parse('zhparser','hello world!我不是为了输赢,我就是认真');
tokid | token
-------+-------
101 | hello
101 | world
117 | !
114 | 我
118 | 不是
112 | 为了
110 | 输赢
117 |,
114 | 我
110 | 就是
118 | 认真
(11 rows)
tokid | token
-------+-------
101 | hello
101 | world
117 | !
114 | 我
118 | 不是
112 | 为了
110 | 输赢
117 |,
114 | 我
110 | 就是
118 | 认真
(11 rows)
postgres=# SELECT to_tsvector('testzhcfg',我就是认真') @@to_tsquery('认真');
?column?
----------
t
(1 row)
?column?
----------
t
(1 row)
?column?
----------
f
(1 row)
----------
f
(1 row)
5、自定义词库
5.1 自定义字典
工具:XDB导入导出工具(http://www.xunsearch.com/scws/down/PHPtool_for_scws_xdb.zip)
scws使用的字典为xdb格式,不可以直接编辑和查看,其对应的文本形式如下:
WORD | TF | IDF | ATTR |
---|---|---|---|
保障房 | 1.00 | 1.00 | n |
WORD | TF | IDF | ATTR |
---|---|---|---|
中央 | 3.00 | 3.00 | n |
地方 | 2.00 | 2.00 | n |
“中央”的权重(TF*IDF)小于“从中”,所以“从中央”一起出现时,就会分为“从中”和“央”。
WORD,TF,IDF,ATTR之间的分割符是tab,其他的会出错
5.2 zhparser使用自定义词典
方法2:通过增加字典文件来扩展词库
约定
- 字典文件的命名格式为usr_dict_num.xdb,其中num为序号,从1开始,表示第几个自定义的字典num必须连续,如果出现usr_dict_1.xdb,usr_dict_2.xdb,usr_dict_4.xdb,那么usr_dict_4.xdb及以后num大于4的字典都不会被加载
- 所有自定义的字典要放在/usr/share/pgsql/tsearch_data下面
- 新增的字典只要复合以上约定可自动加载,无须重新安装zhparser,也无须重新create extension
6、建立全文检索的索引
方式1:表达式索引
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(config_name,body));
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english',title || body));
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english',title || body));
方式2:分离字段索引
ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector;
UPDATE pgweb SET textsearchable_index_col =
to_tsvector('english',coalesce(title,) || coalesce(body,));
CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);
UPDATE pgweb SET textsearchable_index_col =
to_tsvector('english',coalesce(title,) || coalesce(body,));
CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);
7、实验
数据量:17830826条,约4G
在主键id上执行count查询
postgres=# select count(id) from area_detail;
count
----------
17830826
(1 row)
Time: 25749.020 ms
count
----------
17830826
(1 row)
Time: 25749.020 ms
通过id搜索一条记录
postgres=# select * from area_detail where id = '1601799';
Time: 46.024 ms
Time: 46.024 ms
通过like搜索数据库记录
postgres=# select * from area_detail where localityname like '%豆沙%';
Time: 25822.282 ms(约25秒)
Time: 25822.282 ms(约25秒)
通过未建索引的全文检索搜索数据库记录
postgres=# select * from area_detail where to_tsvector('testzhcfg',localityname) @@to_tsquery('testzhcfg','豆沙');
Time: 621077.779 ms
Time: 621077.779 ms