热门标签 | 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
推荐阅读
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 如何配置VisualSVN以确保提交时必须填写日志信息
    在软件开发团队中,成员们有时会忘记在提交代码时添加必要的备注信息。为了规范这一流程,可以通过配置VisualSVN来强制要求团队成员在提交文件时填写日志信息。本文将详细介绍如何设置这一功能。 ... [详细]
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 如何在虚拟机中实现Linux与Windows主机之间的文件夹共享
    为了在虚拟机中实现Linux与Windows主机之间的文件夹共享,首先需要确保Linux系统已安装VMware Tools。如果尚未安装,可以通过虚拟机软件提供的“安装VMware Tools”选项进行安装。安装完成后,通过配置共享文件夹设置,即可实现主机与虚拟机之间的文件互传。此外,建议检查虚拟机网络设置,确保网络连接正常,以提高文件传输的稳定性和速度。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • CentOs6.5基本环境配置(八):svn服务配置
    2019独角兽企业重金招聘Python工程师标准小编采用vm虚拟机进行安装svn版本控制工具,实际linux系统中安装性质一样,只需在客户端连接时 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 配置svn_Zend Studio 配置SVN并导入SVN项目
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了ZendStudio配置SVN并导入SVN项目相关的知识,希望对你有一定的参考价值。 ... [详细]
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社区 版权所有