全部用到到包有:web
cmake-2.6.4.tar.gz (编nlpbamboo用)sql
CRF++-0.53.tar.gz(同上)vim
nlpbamboo-1.1.1.tar.bz2(分词用)bash
postgreSQL-8.3.3.tar.gz(索引用)网络
安装pgsql函数
tar -zxvf postgreSQL-8.3.3.tar.gzpost
cd postgre-8.3.3学习
./configure –prefix=/opt/pgsqlui
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字段进行索引和查询,完整构造一整个搜索引擎。
1、基础篇
本回从一条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));
2、提升篇
基础知识学完了,应该上阵了,为了实现全文检索,咱们须要把一个文档建立一个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’
3、终结篇
看完上面的一堆后,千言万语汇成一句话,本文主要讲的是一条sql,在加了第一部分里所讲述的扩展后,使用下面的sql,从一个字段中搜一句话,还要排序出来:
select * from tabname where to_tsvector(’chinesecfg’,textname) @@ plainto_tsquery(’搜点啥’) order by ts_rank(to_tsvector(’chinesecfg’,textname),plainto_tsquery(’搜点啥’)) limit 10;
以前的create table create index就不写了。授人以渔才是关键。