文档章节

PostgreSQL的中文全文检索(二)

kenyon_君羊
 kenyon_君羊
发布于 2012/10/10 12:04
字数 1325
阅读 1.8W
收藏 52

3 月,跳不动了?>>>

上一篇介绍了postgresql全文检索的环境和一些示例,http://my.oschina.net/Kenyon/blog/80904,都是基于其自带的模式,目前版本默认并不支持中文的全文检索,但是我们的实际使用过程中肯定会有用到中文的检索,好在有强大的社区支持,结合第三方工具可以简单实现PG的中文全文检索。
 
PG的中文全文检索步骤也主要分三步走:
1.将中文分词
2.转换分词,去掉无意义分词
3.按一定顺序排序,建索引加快查询

一、使用到的测试环境与工具
VMWARE 6.0
PostgreSQL 9.1.2
CRF++-0.57        下载地址:http://crfpp.googlecode.com/svn/trunk/doc/index.html
nlpbamboo-1.1.2 下载地址:http://code.google.com/p/nlpbamboo/downloads/list
index.tar.bz2       下载地址:http://code.google.com/p/nlpbamboo/downloads/list 

二、部署过程(root用户)
1.先安装CRF
cd CRF++-0.57
./configure
make
make install
2.安装nlpbamboo
cd nlpbamboo
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=release
make all
make install
3.下载分词数据库文件
下载index.tar.bz2,解压到/opt/bamboo/index

4.查看
安装完了后,到默认的安装路径下查看软件的安装情况,主要的默认路径
 /usr/lib
/usr/include/
/opt/bamboo/
[postgres@localhost ~]$ cd /usr/local/lib
[postgres@localhost lib]$ ll
total 788
-rw-r--r--. 1 root root 516882 Sep  3 19:57 libcrfpp.a
-rwxr-xr-x. 1 root root    952 Sep  3 19:57 libcrfpp.la
lrwxrwxrwx. 1 root root     17 Sep  3 19:57 libcrfpp.so -> libcrfpp.so.0.0.0
lrwxrwxrwx. 1 root root     17 Sep  3 19:57 libcrfpp.so.0 -> libcrfpp.so.0.0.0
-rwxr-xr-x. 1 root root 280760 Sep  3 19:57 libcrfpp.so.0.0.0

[postgres@localhost lib]$ cd /usr/lib
[postgres@localhost lib]$ ll lib*
-rw-r--r--. 1 root root 1027044 Sep  3 20:02 libbamboo.a
lrwxrwxrwx. 1 root root      14 Sep  3 20:03 libbamboo.so -> libbamboo.so.2
-rwxr-xr-x. 1 root root  250140 Sep  3 20:02 libbamboo.so.2
lrwxrwxrwx. 1 root root      25 Sep  3 23:56 libcrfpp.a -> /usr/local/lib/libcrfpp.a
lrwxrwxrwx. 1 root root      26 Sep  3 23:56 libcrfpp.so -> /usr/local/lib/libcrfpp.so
lrwxrwxrwx. 1 root root      28 Sep  3 23:56 libcrfpp.so.0 -> /usr/local/lib/libcrfpp.so.0

[postgres@localhost bamboo]$ cd /opt/bamboo/
[postgres@localhost bamboo]$ ll
total 17412
drwxr-xr-x. 2 postgres postgres     4096 Sep  3 20:03 bin
drwxr-xr-x. 2 postgres postgres     4096 Aug 15 01:52 etc
drwxr-xr-x. 4 postgres postgres     4096 Aug 15 01:52 exts
drwxr-sr-x. 2 postgres postgres     4096 Apr  1  2009 index
-rw-r--r--. 1 postgres postgres 17804377 Sep  3 23:52 index.tar.bz2
drwxr-xr-x. 2 postgres postgres     4096 Sep  3 20:03 processor
drwxr-xr-x. 2 postgres postgres     4096 Aug 15 01:52 template
5.编辑中文检索干扰词汇
编辑该词汇是为了减少一些无意义的词汇被检索出来,比如'a',‘的','得'等
[postgres@localhost tsearch_data]$touch /usr/share/postgresql/8.4/tsearch_data/chinese_utf8.stop

[postgres@localhost tsearch_data]$ pwd
/home/postgres/share/tsearch_data
[postgres@localhost tsearch_data]$ more chinese_utf8.stop 
的
我
我们
6.编译
cd /opt/bamboo/exts/postgres/pg_tokenize
make
make install
cd /opt/bamboo/exts/postgres/chinese_parser
make
make install
7.导入分词函数和分词模块
[postgres@localhost ~]$ psql
postgres=# \i /home/postgres/share/contrib/pg_tokenize.sql
SET
CREATE FUNCTION
postgres=#  \i /home/postgres/share/contrib/chinese_parser.sql
SET
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TEXT SEARCH PARSER
CREATE TEXT SEARCH CONFIGURATION
CREATE TEXT SEARCH DICTIONARY
ALTER TEXT SEARCH CONFIGURATION
8.安装完图形化展示

9.不同的DB安装中文分词
假如在一台机子上同时有多个DB,则只需要把分词函数和分词模版在新库里导入一下即可。

三、应用

1.使用tokens测试中文分词效果
[postgres@localhost ~]$ psql -p 5432
psql (9.1.2)
Type "help" for help.

postgres=# select tokenize('中文词分浙江人民海量的人');
            tokenize            
---------------------------------
中文词 分 浙江 人民 海量 的 人
(1 row)

postgres=# SELECT to_tsvector('chinesecfg', '我爱北京天安门');
            to_tsvector           
-----------------------------------
'北京':3 '天安门':4 '我':1 '爱':2
(1 row)

postgres=# select tokenize('南京市长江大桥');
     tokenize     
-------------------
南京市 长江 大桥
(1 row)

postgres=# select tokenize('南京市长');
  tokenize 
------------
南京 市长
(1 row)
有一个比较好的分词效果,最明显的是南京市长江大桥,并没有被分成南京,市长,江大桥之类的。

2.使用一个普通测试表,新建一个tsvector列用来存放分词数据
ALTER TABLE t_store_adv add column index_col_ts tsvector;
UPDATE t_store_adv SET index_col_ts =
to_tsvector('chinesecfg', coalesce(adv_title,'') || ' ' || coalesce(adv_content,''));
3.建立索引
CREATE INDEX t_store_adv_idx ON t_store_adv USING gin(index_col_ts);
4.查询
[postgres@localhost ~]$ psql  -p 5432
psql (9.1.2)
Type "help" for help.

postgres=# select count(1) from t_store_adv;
 count 
-------
  38803
(1 row)

postgres=# SELECT count(1) FROM t_store_adv WHERE index_col_ts @@ to_tsquery('南京');
 count 
-------
    16
(1 row)

postgres=# explain SELECT count(1) FROM t_store_adv WHERE index_col_ts @@ to_tsquery('南京');
                                      QUERY PLAN                                      
--------------------------------------------------------------------------------------
 Aggregate  (cost=108.61..108.62 rows=1 width=0)
   ->  Bitmap Heap Scan on t_store_adv  (cost=12.21..108.55 rows=27 width=0)
         Recheck Cond: (index_col_ts @@ to_tsquery('南京'::text))
         ->  Bitmap Index Scan on t_store_adv_idx  (cost=0.00..12.21 rows=27 width=0)
               Index Cond: (index_col_ts @@ to_tsquery('南京'::text))
(5 rows)

--普通的文本检索
postgres=# select count(1) from t_store_adv where (adv_content like '%南京%' or adv_title like '%南京%');
 count 
-------
    17
(1 row)

postgres=# explain select count(1) from t_store_adv where (adv_content like '%南京%' or adv_title like '%南京%');
                                             QUERY PLAN                                             
----------------------------------------------------------------------------------------------------
 Aggregate  (cost=1348.05..1348.06 rows=1 width=0)
   ->  Seq Scan on t_store_adv  (cost=0.00..1348.05 rows=1 width=0)
         Filter: (((adv_content)::text ~~ '%南京%'::text) OR ((adv_title)::text ~~ '%南京%'::text))
(3 rows)
本次测试的数据量不是很大,但从执行计划上可见一斑,所消耗的资源是要少很多的,当然存储会消耗多一点,数据量大的情况下,索引检索的效率也能看出有很大的提升,具体可参考一个例子:http://www.oschina.net/question/96003_19020

四、总结:
示例中略去了使用触发器来更新tsvector列。使用中文全文检索可以有效提升中文检索速度,只是目前还不是内置的,需要借助第三方工具手工安装一下,选择的分词方案也比较多,可以择优选择。

五、参考:
http://www.cnblogs.com/shuaixf/archive/2011/09/10/2173260.html
http://www.54chen.com/_linux_/postgresql-bamboo-lucene-part2.html
----kenyon never gone!

© 著作权归作者所有

kenyon_君羊
粉丝 503
博文 173
码字总数 125197
作品 0
杭州
其他
私信 提问
加载中

评论(17)

kenyon_君羊
kenyon_君羊 博主

引用来自“王振威”的评论

IKAnalyzer 有办法应用到postgresql的中文分次么?

MayBe可以,没有折腾过,有人开发过其他的中文分词,看下这个http://bbs.pgsqldb.com/client/post_show.php?zt_auto_bh=57211,有方法
王振威
王振威
IKAnalyzer 有办法应用到postgresql的中文分次么?
kenyon_君羊
kenyon_君羊 博主

引用来自“龙上”的评论

引用来自“kenyon”的评论

引用来自“龙上”的评论

引用来自“kenyon”的评论

引用来自“龙上”的评论

编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.

在默认的DB下找找看。

默认DB下也没有的

没有怎么能用呢.....

我查看了我的postgresql-dev的版本是8.4的,server版本是9.2的这个不一致会不会导致这个问题?

我是用的9.1版本,8.x版本没有试过....得验证下,你可以找个9.x版本的用用
龙上
龙上

引用来自“kenyon”的评论

引用来自“龙上”的评论

引用来自“kenyon”的评论

引用来自“龙上”的评论

编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.

在默认的DB下找找看。

默认DB下也没有的

没有怎么能用呢.....

我查看了我的postgresql-dev的版本是8.4的,server版本是9.2的这个不一致会不会导致这个问题?
kenyon_君羊
kenyon_君羊 博主

引用来自“龙上”的评论

引用来自“kenyon”的评论

引用来自“龙上”的评论

编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.

在默认的DB下找找看。

默认DB下也没有的

没有怎么能用呢.....
龙上
龙上

引用来自“kenyon”的评论

引用来自“龙上”的评论

编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.

在默认的DB下找找看。

默认DB下也没有的
kenyon_君羊
kenyon_君羊 博主

引用来自“龙上”的评论

编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.

在默认的DB下找找看。
龙上
龙上
PGLIB=/opt/pgsql/lib
好像把这个加进去就可以用分词了.不过我的pgadmin没有像楼主的FTS.我的是全部都是0
龙上
龙上
编辑了makefile文件使用了绝对路径搞定了安装.不过我安装完成以后没有像楼主图片的东西.
FTS全部都是0.
龙上
龙上
执行第六步的时候
cd /opt/bamboo/exts/postgres/pg_tokenize;make
出现如下错误:
make: pg_config:命令未找到
使用yum install postgresql-devel安装解决.不过这个版本是8.4.
7.导入分词函数和分词模块
这个SQL语句一直导入不成功
PostgreSQL 相似文本检索与去重 - (银屑病怎么治?银屑病怎么治疗?银屑病怎么治疗好?银屑病怎么能治疗好?)

标签 PostgreSQL , 相似字符串 , 全文检索 , 去重 , 相似问题 , 医疗 , plr , plpython , madlib , 文本处理 背景 在云栖社区的问答区,有一位网友提到有一个问题: 解这个问题的思路 1. 首先...

德哥
2018/04/18
0
0
PostgreSQL全文检索简介

PostgreSQL自带有一个简易的全文检索引擎,可以实现小规模数据量的全文检索功能。本文我们将引导介绍一下这个功能,对于小数据量的搜索这个功能是足够使用的,而无需搭建额外的ES等重量级的全...

dragon_tech
2019/04/24
36
0
PostgreSQL安装详细步骤(windows)

PostgreSQL安装: 一、windows下安装过程 安装介质:postgresql-9.1.3-1-windows.exe(46M),安装过程非常简单,过程如下: 1、开始安装: 2、选择程序安装目录: 注:安装 PostgreSQL 的分...

引鸩怼孑
2015/04/21
443
1
PostgreSQL的全文检索(一)

在全文检索没有出来之前,普通的文件检索都是采用的like,~,或者ilike来匹配文档字段中内容,这种检索方法对小数据量的文本检索是OK的,但数据量大了就不行了。 普通检索的劣势: 1.语言不能完...

kenyon_君羊
2012/09/28
8.6K
9
postgresql 英文环境下乱码问题

postgresql恢复数据库,系统环境为英文,恢复文件格式为 xxx.bak,文件存放路径中包含中文,如(C:\中文\xxx.bak),使用postgresql自带的psql执行恢复操作,发现文件路径中文为乱码,请问如...

沸羊羊
2015/10/27
520
1

没有更多内容

加载失败,请刷新页面

加载更多

Createjs之看你有多色

游戏介绍:看你有多色“是一款基于Html5技术、挑战人类眼球对颜色的分辨能力、好玩易上手的小游戏。据开发者Kaiser介绍,其游戏灵感是源于大家都很熟悉的找茬游戏,并根据 移动互联网的用户行...

MannYuKi
27分钟前
18
0
dubbo源码分析

调用过程

steveJox
27分钟前
5
0
Spring IOC 和 AOP 的核心思想

IOC 和 AOP 是Spring的两大核心思想,那么这种技术的实现方式和核心思将又是什么呢? 首先,我们知道Spring是一个分层的轻量级开源框架,大量的配置文件是不可缺少的,但是其核心是要把这些配置文...

苗小喵
30分钟前
15
0
docker+nginx+tomcat负载均衡

1.下载tomcat docker pull hub.c.163.com/library/tomcat:8.0.46-jre8 2.启动tomcat,在浏览器输入地址访问。 # 启动tomcat1docker run -d -p 8082:8080 --name tomcat1 tomcat# 启动tom......

Pcat
36分钟前
19
0
学习之法

少年听雨歌楼上,红烛昏罗帐。 壮年听雨客舟中,江阔云低 断雁叫西风。 而今听雨僧庐下,鬓已星星也。 悲欢离合总无情,一任阶前 点滴到天明。 学者,动心忍性,曾益其所不能。 学习之道,各...

mr_liang0
56分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部