设为首页 收藏本站
查看: 1344|回复: 0

[经验分享] 使用postgreSQL+bamboo搭建比lucene方便N倍的全文搜索

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-21 06:42:16 | 显示全部楼层 |阅读模式
  所有用到到包有:
  cmake-2.6.4.tar.gz (编nlpbamboo用)
  CRF++-0.53.tar.gz(同上)
  nlpbamboo-1.1.1.tar.bz2(分词用)
  postgreSQL-8.3.3.tar.gz(索引用)
  安装pgsql
  tar -zxvf postgreSQL-8.3.3.tar.gz
  cd postgre-8.3.3
  ./configure –prefix=/opt/pgsql
  make
make install
  useradd postgre
  chown -R postgre.postgre /opt/pgsql
su – postgre
vi ~postgre/.bash_profile
添加
export PATH
PGLIB=/opt/pgsql/lib
PGDATA=/data/PGSearch
PATH=$PATH:/opt/pgsql/bin
MANPATH=$MANPATH:/opt/pgsql/man
export PGLIB PGDATA PATH MANPATH
  # mkdir -p /data/PGSearch
  # chown -R postgre.postgre /data/PGSearch
  # chown -R postgre.postgre /opt/pgsql
  #sudo -u postgre /opt/pgsql/bin/initdb –locale=zh_CN.UTF-8 –encoding=utf8 -D /data/PGSearch
  #sudo -u postgre /opt/pgsql/bin/postmaster -i -D /data/PGSearch &  //允许网络访问
  #sudo -u postgre /opt/pgsql/bin/createdb kxgroup
# vim /data/PGSearch/pg_hba.conf  如下增加可访问的机器:
  host    all         all         10.2.19.178 255.255.255.0               trust
  #su – postgre
  $pg_ctl stop
  $postmaster -i -D /data/PGSearch &
安装中文分词(Cmake CRF++ bamboo)
Cmake是为了编译bamboo,CRF++是bamboo依赖的。
  tar -zxvf cmake-2.6.4.tar.gz
  cd cmake-2.6.4
./configure
gmake
make install
  tar -zxvf CRF++-0.53.tar.gz
cd CRF++-0.53
./configure
make
make install
  tar -jxvf nlpbamboo-1.1.1.tar.bz2
cd nlpbamboo-1.1.1
mkdir build
cd build/
cmake .. -DCMAKE_BUILD_TYPE=release
make all
make install
  cp index.tar.bz2 /opt/bamboo/
cd /opt/bamboo/
tar -jxvf index.tar.bz2
  #/opt/bamboo/bin/bamboo
  如果出现:
  ERROR: libcrfpp.so.0: cannot open shared object file: No such file or directory
  就执行:
  ln -s /usr/local/lib/libcrfpp.so.* /usr/lib/
ldconfig
  增加上中文分词扩展到pgsql
  #vim /root/.bash_profile 也增加:
  PGLIB=/opt/pgsql/lib
PGDATA=/data/PGSearch
PATH=$PATH:/opt/pgsql/bin
MANPATH=$MANPATH:/opt/pgsql/man
export PGLIB PGDATA PATH MANPATH
  #source ~/.bash_profile
  cd /opt/bamboo/exts/postgres/chinese_parser/
make
make install
  su – postgre
cd /opt/pgsql/share/contrib/
touch /opt/pgsql/share/tsearch_data/chinese_utf8.stop
psql kxgroup
\i chinese_parser.sql 导入
  再执行下面的sql,已经可以将一段话分词了:
  SELECT to_tsvector(’chinesecfg’, ‘结果在命令行下执行bamboo才知道’);
  先到这里,下一部分讲述对TEXT字段进行索引和查询,完整构造一整个搜索引擎。
  一、基础篇
  本回从一条sql开始:
  select * from dbname where field_name @@ ‘aa|bb’ order by rank(field_name, ‘aa|bb’);
  从这个sql字面意思讲解:从 dbname这个表中查field_name匹配aa或者是bb的词,并且按照他们的匹配的RANK排序。
  基本上明白上面这段话后,来学习四个概念:tsvector、tsquery、@@ 、gin。
  1.tsvector:
  在postgreSQL 8.3自带支持全文检索功能,在之前的版本中需要安装配置tsearch2才能使用。它提供两个数据类型(tsvector,tsquery),并且通过 动态检索自然语言文档的集合,定位到最匹配的查询结果,tsvector正是其中之一。
  一个tsvector的值是唯一分词的分类列表,把一话一句词格式化为不同的词条,在进行分词处理的时候,tsvector会自动去掉分词中重复的词条,按照一定的顺序装入。例如
  SELECT ‘a fat cat sat on a mat and ate a fat rat’::tsvector;
tsvector
—————————————————-
‘a’ ‘on’ ‘and’ ‘ate’ ‘cat’ ‘fat’ ‘mat’ ‘rat’ ’sat’
  通过tsvector把一个字符串按照空格进行分词,这可以把分词后的词按照出现的次数排成一排(还会按词长度)。
  对于英文和中文的全文检索我们还要看下面这条sql:
  SELECT to_tsvector(’english’, ‘The Fat Rats’);
to_tsvector
—————–
‘fat’:2 ‘rat’:3
  to_tsvector函数来是tsvector规格化的,在其中可指定所使用的分词。
  2.tsquery:
  顾名思义,tsquery,表示的应该是查询相关的.tsquery是存储用于检索的词条.并且可以联合使用boolean 操作符来连接, & (AND), | (OR), and ! (NOT). 使用括号(),可以强制分为一组.
  同时,tsquery 在做搜索的时候,也可以使用权重,并且每个词都可以使用一个或者多个权重标记,这样在检索的时候,会匹配相同权重的信息.跟上面的tsvector相同,tsquery也有一个to_tsquery函数.
  3.@@:
  在postgresql中全文检索匹配操作使用@@ 操作符,如果一个
tsvector(document) 匹配到 tsquery(query)则返回true.
  看一个简单的例子:
  SELECT ‘a fat cat sat on a mat and ate a fat rat’::tsvector @@ ‘cat & rat’::tsquery;
?column?
———-
t
我们在处理索引的时候还是要使用他们的函数如下:
SELECT to_tsvector(’fat cats ate fat rats’) @@ to_tsquery(’fat & rat’);
?column?
———-
t
并且操作符 @@ 可以使用text作为tsvector和tsquery.如下操作符可以使使用的方法
  tsvector @@ tsquery
tsquery  @@ tsvector
text @@ tsquery
text @@ text
上面的前两种我们已经使用过了,但是后两种,
text @@ tsquery 等同于 to_tsvector(x) @@ y.
text @@ text 等同于 to_tsvector(x) @@ plainto_tsquery(y).(~)plainto_tsquery在后面讲。。。
  4.gin:
  gin是一种索引的名称,全文索引用的。
  我们可以通过创建gin索引来加速检索速度.例如
  CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(’english’, body));
  创建索引可以有多种方式.索引的创建甚至可以连接两个列:
CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector(’english’, title || body));
  二、提高篇
  基础知识学完了,应该上阵了,为了实现全文检索,我们需要把一个文档创建一个tsvector 格式,并且通过tsquery实现用户的查询,在查询中我们返回一个按照重要性排序的查询结果。
  先看一个to_tsquery的sql:
  SELECT to_tsquery(’english’, ‘Fat | Rats:AB’);
to_tsquery
——————
‘fat’ | ‘rat’:AB
  可以看出,to_tsquery函数在处理查询文本的时候,查询文本的单个词之间要使用逻辑操作符(& (AND), | (OR) and ! (NOT))连接(或者使用括号)。
  如果执行下面这条sql就会出错:
  SELECT to_tsquery(’english’, ‘Fat  Rats’);
  plainto_tsquery函数却可以提供一个标准的tsquery,如上面的例子,plainto_tsquery会自动加上逻辑&操作符。
SELECT plainto_tsquery(’english’, ‘Fat  Rats’);
  plainto_tsquery
—————–
‘fat’ & ‘rat’
但是plainto_tsquery函数不能够识别逻辑操作符和权重标记。
SELECT plainto_tsquery(’english’, ‘The Fat & Rats:C’);
plainto_tsquery
———————
‘fat’ & ‘rat’ & ‘c’
  三、终结篇
  看完上面的一堆后,千言万语汇成一句话,本文主要讲的是一条sql,在加了第一部分里所讲述的扩展后,使用下面的sql,从一个字段中搜一句话,还要排序出来:
  select* from tabname where to_tsvector(’chinesecfg’,textname) @@ plainto_tsquery(’搜点啥’) order by ts_rank(to_tsvector(’chinesecfg’,textname),plainto_tsquery(’搜点啥’)) limit10;
  之前的create table create index就不写了。授人以渔才是关键。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303074-1-1.html 上篇帖子: 在postgresql 中使用plpgsql函数返回表格记录集(转) 下篇帖子: PostgreSQL: 如何获取一维数组的相同元素并根据相似度排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表