[postgres@localhost ~]$ psql
psql (9.3.4)
Type "help" for help.
postgres=# CREATE EXTENSION ZHPARSER;
postgres=# CREATE TEXT SEARCH CONfigURATION testzhcfg (PARSER = zhparser);
postgres=# ALTER TEXT SEARCH CONfigURATION testzhcfg ADD MAPPing FOR n,v,a WITH simple;
注:此处的n,a为词性(名词、动词、形容词),分词时会只考虑此处指定的词性,其他诸如介词、动名词会被忽略。scws中的所有词性说明:http://www.xunsearch.com/scws/docs.PHP#attr,并不是所有的scws中的词性都被支持,如ns(地理名词)是不被支持的。 @H_404_1@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) postgres=# SELECT to_tsvector('testzhcfg',我就是认真') @@to_tsquery('认真');
?column?
----------
t
(1 row)
?column?
----------
t
(1 row)
?column?
----------
f
(1 row)
@H_404_1@5、自定义词库 5.1 自定义字典 工具:XDB导入导出工具(http://www.xunsearch.com/scws/down/PHPtool_for_scws_xdb.zip) 需要有PHP环境(可在命令行下运行即可,需要有mbstring库),使用方法请参考压缩包中的readme.txt 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 |
while(1){
snprintf(dict_path,MAXPGPATH,"%s/tsearch_data/usr_dict_%d.xdb",sharepath,beg);
exist=access(dict_path,F_OK);
if(exist==-1)
break;
scws_add_dict(scws,SCWS_XDICT_XDB);
beg++;
}
修改zhparser.c,需要增加头文件:#include "unistd.h" /usr/share/pgsql/tsearch_data该路径视postgresql的安装路径而定 @H_404_1@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));
方式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);
在使用独立字段存储 tsvector 形式的时候,我们需要创建一些触发器以保持 tsvector 字段对 Title 和 body 修改的同步。分离字段方式比表达式索引方式的一个优点是它不需要在查询里明确声明文本 搜索的配置就可以使用索引。如上面例子所示,查询可以依赖于default_text_search_config。另 外一个优点是搜索会更快,因为它不需要重新调用 to_tsvector 函数来判断是否和索引匹配。不过, 表达式索引的方法的优点是设置简单,而且它需要的磁盘空间更少,因为 tsvector 表现形式不用明 确存储。 @H_404_1@7、实验 数据量:17830826条,约4G 在主键ID上执行count查询 postgres=# select count(ID) from area_detail;
count
----------
17830826
(1 row)
Time: 25749.020 ms
通过ID搜索一条记录 postgres=# select * from area_detail where ID = '1601799';
Time: 46.024 ms
通过like搜索数据库记录 postgres=# select * from area_detail where localityname like '%豆沙%';
Time: 25822.282 ms(约25秒)
通过未建索引的全文检索搜索数据库记录 postgres=# select * from area_detail where to_tsvector('testzhcfg',localityname) @@to_tsquery('testzhcfg','豆沙');
Time: 621077.779 ms
通过建立了索引(gin)的全文检索搜索数据库记录 Time: 158.971 ms(约0.1秒)
@H_404_1@8 参考 http://www.xunsearch.com/scws/index.PHP,感谢hightman大神 https://github.com/amutu/zhparser,感谢 amutu大神 http://blog.163.com/digoal@126/blog/static/163877040201422410175698/ http://www.pgsqldb.org:8079/mwiki/index.PHP/12._%E5%85%A8%E6%96%87%E6%90%9C%E7%B4%A2 http://my.oschina.net/Kenyon/blog/80904 总结
以上是内存溢出为你收集整理的Postgresql全文检索全部内容,希望文章能够帮你解决Postgresql全文检索所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)