热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQL的中文全文检索

http:my.oschina.netKenyonblog82305http:www.54chen.com_linux_postgresql-bamboo-lucene-part2.

http://my.oschina.net/Kenyon/blog/82305

http://www.54chen.com/_linux_/postgresql-bamboo-lucene-part2.html


上一篇介绍了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 南京'::text))
-> Bitmap Index Scan on t_store_adv_idx (cost=0.00..12.21 rows=27 南京'::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 %南京%'::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
推荐阅读
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
    前言最近看到很多应届生晒offer,稍有名气点的公司给出的价格都是一年30多W或者月薪20几k,相比之下工作几年的自己薪资确实很寒酸.根据我自己找工作经历,二线城市一般小公司招聘 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • solr导入mysql_Solr导入MySQL中的数据
    一、目标将MySQL数据库中的数据导入至Solr中,并且由Solr生成中文索引,使用Solr查询信息。二、数据导入1、将solr-8.2.0dist下的 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了Nutch相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
和谐啄木鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有