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

PostgreSQL数据库使用nlpbamboochinesecfg进行中文分词

环境:CentOS5.x64bitPostgreSQL9.1.3nlpbamboo-1.1.2cmake-2.8.8CRF++-0.57安装:--cmaketar-zxvfcmake-2.8.8.tar.gzcdcmake-2.8.8./bootstrap--prefix/opt/cmake2.8.8gmakegmak
环境 : 
CentOS 5.x 64bit
PostgreSQL 9.1.3
nlpbamboo-1.1.2
cmake-2.8.8
CRF++-0.57

安装 : 

-- cmake

tar -zxvf cmake-2.8.8.tar.gz
cd cmake-2.8.8
./bootstrap --prefix=/opt/cmake2.8.8
gmake
gmake install
vi ~/.bash_profile
export PATH=/opt/cmake2.8.8/bin:$PATH
. ~/.bash_profile

-- crf

tar -zxvf CRF++-0.57.tar.gz
cd CRF++-0.57
./configure
gmake
gmake install

-- nlpbamboo

vi ~/.bash_profile
export PGHOME=/opt/pgsql
export PATH=$PGHOME/bin:/opt/bamboo/bin:/opt/cmake2.8.8/bin:$PATH:.
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:.
. ~/.bash_profile
tar -jxvf nlpbamboo-1.1.2.tar.bz2
cd nlpbamboo-1.1.2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=release
gmake all
gmake install

-- 加入lib库链接.

echo "/usr/lib" >>/etc/ld.so.conf (这个命令是bamboo对应的动态链接库)
echo "/usr/local/lib" >>/etc/ld.so.conf (这个命令是CRF对应的动态链接库)
ldconfig -f /etc/ld.so.conf
-- 测试是否加入正常
ldconfig -p|grep bambo
        libbamboo.so.2 (libc6,x86-64) => /usr/lib/libbamboo.so.2
        libbamboo.so (libc6,x86-64) => /usr/lib/libbamboo.so
ldconfig -p|grep crf
        libcrfpp.so.0 (libc6,x86-64) => /usr/local/lib/libcrfpp.so.0
        libcrfpp.so (libc6,x86-64) => /usr/local/lib/libcrfpp.so

-- 加入索引

cd /opt/bamboo
wget http://nlpbamboo.googlecode.com/files/index.tar.bz2
tar -jxvf index.tar.bz2

-- 编译PostgreSQL支持模块.

cd /opt/bamboo/exts/postgres/chinese_parser
make
make install
touch $PGHOME/share/tsearch_data/chinese_utf8.stop
cd /opt/bamboo/exts/postgres/pg_tokenize
make
make install

-- 安装PostgreSQL支持模块

su - postgres
cd $PGHOME/share/contrib/
psql -h 127.0.0.1 postgres postgres -f chinese_parser.sql
psql -h 127.0.0.1 postgres postgres -f pg_tokenize.sql

-- 查看全文检索配置中加入了chinesecfg的配置.

postgres=# select * from pg_ts_config;
  cfgname   | cfgnamespace | cfgowner | cfgparser 
------------+--------------+----------+-----------
 simple     |           11 |       10 |      3722
 danish     |           11 |       10 |      3722
 dutch      |           11 |       10 |      3722
 english    |           11 |       10 |      3722
 finnish    |           11 |       10 |      3722
 french     |           11 |       10 |      3722
 german     |           11 |       10 |      3722
 hungarian  |           11 |       10 |      3722
 italian    |           11 |       10 |      3722
 norwegian  |           11 |       10 |      3722
 portuguese |           11 |       10 |      3722
 romanian   |           11 |       10 |      3722
 russian    |           11 |       10 |      3722
 spanish    |           11 |       10 |      3722
 swedish    |           11 |       10 |      3722
 turkish    |           11 |       10 |      3722
 chinesecfg |           11 |       10 |     33463
(17 rows)

-- 测试tokenize分词函数

postgres=# select * from tokenize('你好我是中国人');
      tokenize       
---------------------
 你好 我 是 中国 人 
(1 row)
postgres=# select * from tokenize('中华人民共和国');
    tokenize     
-----------------
 中华人民共和国 
(1 row)
postgres=# select * from tokenize('百度');
 tokenize 
----------
 百度 
(1 row)
postgres=# select * from tokenize('谷歌');
 tokenize 
----------
 谷歌 
(1 row)
postgres=# select * from tokenize('今年是龙年');
   tokenize    
---------------
 今年 是 龙年 
(1 row)

-- 测试全文检索类型转换函数

postgres=# select * from to_tsvector('chinesecfg','你好,我是中国人.目前在杭州斯凯做数据库相关的工作.');
                                                                to_tsvector                                                         
------------------------------------------------------------------------------------------------------------------------------------
-------
 ',':2 '.':7,17 '中国':5 '人':6 '你好':1 '做':12 '在':9 '工作':16 '我':3 '数据库':13 '斯凯':11 '是':4 '杭州':10 '的':15 '目前':8 '相
关':14
(1 row)

全文检索类型适合场景, 大内容的模糊查询, 非精确的模糊匹配 : 

例如, title和content分别保存标题和正文的原始内容,
ts_title和ts_content用来保存分词后的全文检索内容.

postgres=# create table blog (id serial primary key, user_id int8, title text, content text, ts_title tsvector, ts_content tsvector);
NOTICE:  CREATE TABLE will create implicit sequence "blog_id_seq" for serial column "blog.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "blog_pkey" for table "blog"
CREATE TABLE

在tsvector的字段上可以使用gist索引, 或者gin索引, 加速检索.

postgres=# create index idx_blog_ts1 on blog using gist(ts_title);
CREATE INDEX
postgres=# create index idx_blog_ts2 on blog using gist(ts_content);
CREATE INDEX

插入测试内容 : 

postgres=# insert into blog (user_id,title,content,ts_title,ts_content) values (1,'PostgreSQL QQ群 FAQ贴 - 1','QQ群里一些网友问到的 问题,收集如下 : 
目录 : 
1. PostgreSQL存储过程中自定义异常怎么弄?
2. PostgreSQL9.1的同步事务在某些情况下用户主动cancel等待sync replication standby 的acknowledge,实际本地已提交.
3. PostgreSQL如何满足已经存在则更新, 不存在则插入的需求.
4. copy和insert哪个效率高?
5. PostgreSQL能不能限制数据库的大小?
6. 怎样给一个用户授予只读角色?
7. 不想让数据插入到某个表应该怎么做?
8. PostgreSQL 中有没有rownum这样的,显示结果集的序号?
9. PostgreSQL 函数中如何使用savepoint?
10.请问, pg脚本有宏替换, 计算字符串公式的能力? 类似 a=2 ; evaluate(5-a) ; 如果将这个值赋值给这个变量呢? zresult = evaluate(5-a) ;
11.UPDATE A表 FROM B表 ?
12. hex转decimal
13. PostgreSQL 时区.',to_tsvector('chinesecfg','PostgreSQL QQ群 FAQ贴 - 1'),to_tsvector('chinesecfg','QQ群里一些网友问到的问题,收集如下 : 
目录 : 
1. PostgreSQL存储过程中自定义异常怎么弄?
2. PostgreSQL9.1的同步事务在某些情况下用户主动cancel等待sync replication standby 的acknowledge,实际本地已提交.
3. PostgreSQL如何满足已经存在则更新, 不存在则插入的需求.
4. copy和insert哪个效率高?
5. PostgreSQL能不能限制数据库的大小?
6. 怎样给一个用户授予只读角色?
7. 不想让数据插入到某个表应该怎么做?
8. PostgreSQL 中有没有rownum这样的,显示结果集的序号?
9. PostgreSQL 函数中如何使用savepoint?
10.请问, pg脚本有宏替换, 计算字符串公式的能力? 类似 a=2 ; evaluate(5-a) ; 如果将这个值赋值给这个变量呢? zresult = evaluate(5-a) ;
11.UPDATE A表 FROM B表 ?
12. hex转decimal
13. PostgreSQL 时区.'));

分词查询测试 : 

postgres=# select ts_content from blog;

'(':155,171 ')':157,173 ',':46,60,135,142 '.':28,51,67,189
'1':29 '1.':15 '10.':133 '11.update':175 '12.':182 '13.':186
'2':152 '2.

':26 '3.':52 '4.':68 '5-a':156,172 '5.':76 '6.':86 '7.':96
'8.':109 '9.':125 ':':12,14 ';':153,158,174 '=':151,169
'?':25,75,85,95,1

08,124,132,148,167,181 'a':150,176 'acknowledge':45
'b':179 'cancel':39 'copy':69 'decimal':185 'evaluate':154,170
'from':178 'hex':

183 'insert':71 'pg':136 'postgresql':16,53,77,110,126,187
'postgresql9':27 'qq':1 'replication':42 'rownum':115
'savepoint':131 'st

andby':43 'sync':41 'zresult':168 '一个':89 '一些':3 '下':36
'不':61,79,97 '中':19,111,128 '主动':38 '事务':32 '使用':130
'值赋值':1

62 '做':107 '公式':145 '函数':127 '则':58,63 '到':6,102 '变量':165
'只':92 '同步':31 '呢':166 '和':70 '哪个':72 '在':33 '大小':84 '

下':11 '如何':54,129 '如果':159 '字符串':144 '存储':17 '存在':57,62
'宏替':140 '定义':21 '实际':47 '将':160 '已':49 '已经':56 '序号'

:123 '应该':105 '异常':22 '弄':24 '怎么':23,106 '怎样':87 '情况':35
'想':98 '换':141 '授予':91 '提交':50 '插入':64,101 '收集':10 '效

率':73 '数据':100 '数据库':82 '时区':188 '显示':119 '更新':59
'有':112,114,139 '本':138 '本地':48 '某个':103 '某些':34 '没':113
'满

':55 '用户':37,90 '的':7,30,44,65,83,117,122,146 '目录':13
'等待':40 '类似':149 '结果':120 '给':88,163 '网友':4 '群里':2
'能':78,80 

'能力':147 '脚':137 '自':20 '表':104,177,180 '角色':94 '计算':143
'让':99 '请问':134 '读':93 '转':184 '过程':18 '这个':161,164 '这样

':116 '问':5 '问题':8 '限制':81 '集':121 '需求':66 '高':74
',':9,118

从上面的全文检索类型字段ts_content可以看出, 函数 和 表 在这分词里面, 使用 函数 和 表
作为匹配条件查询时将返回结果, 换个不存在的查询则没有结果 : 

postgres=# select user_id,title from blog where ts_content
@@ to_tsquery('函数 & 中国');

 user_id | title 

---------+-------

(0 rows)

postgres=# select user_id,title from blog where ts_content
@@ to_tsquery('函数 & 表');

 user_id |           title
          

---------+---------------------------

       1 | PostgreSQL QQ群 FAQ贴 -
1

(1 row)

查看执行计划 : 

postgres=# explain select user_id,title from blog where ts_content @@ to_tsquery('函数 & 中国');
QUERY PLAN
--------------------------------------------------------------------------
Index Scan using idx_blog_ts2 on blog (cost=0.00..4.27 rows=1 width=40)
Index Cond: (ts_content @@ to_tsquery('函数 & 中国'::text))
(2 rows)
postgres=# explain select user_id,title from blog where ts_content @@ to_tsquery('函数 & 表');
QUERY PLAN
--------------------------------------------------------------------------
Index Scan using idx_blog_ts2 on blog (cost=0.00..4.27 rows=1 width=40)
Index Cond: (ts_content @@ to_tsquery('函数 & 表'::text))
(2 rows)
推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
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社区 版权所有