Sphinx实验手册.docx
《Sphinx实验手册.docx》由会员分享,可在线阅读,更多相关《Sphinx实验手册.docx(22页珍藏版)》请在冰豆网上搜索。
Sphinx实验手册
Sphinx实验手册
Sphinx+linux+apache+mysql+php+coreseek
环境准备:
源代码编译的LAMP环境
Centos5.5Linux版本
Mysql-5.1mysql版本
Apache-2.2.9apache版本
Php-5.2.6php版本
Sphinx安装与运行测试
(1)、下载Sphinx
从sphinx官网上找到sphinx的安装源码,我们下的是0.9.9-release版。
下载地址:
如果你的linux能联网的话,用wget命令直接下载.
Wget
解压:
tar-zxvfsphinx-0.9.9.tar.gz
(2)、编译安装
进入到sphinx的源码文件夹里,运行下列命令就可以安装sphinx了:
cd/lamp/sphinx-0.9.9
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
make && make install
Sphinx中重要的三个命令,(Sphinx安装的bin目录下)
Indexer创建索引命令。
Searchd启动进程命令。
Search命令行搜索命令。
(3)、准备mysql数据
我们需要一些数据,这里我们用安装mysql自带的test库进行测试
准备一个post贴子表,其中该表的字段如下:
Createtablepost(
Idintunsignedauto_incrementprimarykey,
Titlevarchar(200),
Contenttext);
(4)、进入mysql中查看并添加的数据
/usr/local/mysql/bin/mysql-uroot–p123test
向post贴子表中导入数据:
mysql>insertintopost(title,content)values('兄弟连','感谢LAMP兄弟连的广大会员,感谢一直以来对兄弟连的关注与支持');
(5)、配置sphinx.conf配置文件。
进入到sphinx的etc目录找到配置文件
cd /usr/local/sphinx/etc
我们需要备份一下配置文件,防止改错不好处理。
cp sphinx.conf.dist sphinx.conf
进入配置文件
vim sphinx.conf
配置文件的格式:
#################################################################
主数据源:
sourcemain{
}
增量数据源:
sourcedelta:
main{
}
主数据索引:
indexmain{
}
增量数据索引:
indexdelta:
main{
}
分布式索引:
indexdist1{
}
索引器:
indexer{
}
服务进程:
searchd{
}
#################################################################
sphinx.conf的基本配置:
数据源src是名字可以自己指定,即主数据源
sourcesrc1
{
type=mysql#数据库类型
sql_host=localhost#MySQL主机IP
sql_user=root#MySQL用户名
sql_pass=123#MySQL密码
sql_db=test#MySQL数据库
sql_port=3306#MySQL端口
sql_sock=/tmp/mysql.sock#如果是linux下需要开启,指定sock文件
sql_query_pre=SETNAMESUTF8#MySQL检索编码
sql_query_pre=SETSESSIONquery_cache_type=OFF#关闭缓存
sql_query=\#获取数据的SQL语句
SELECTid,title,contentFROMpost
#sql_attr_uint=group_id#对排序字段进行注释
#sql_attr_timestamp=date_added#对排序字段进行注释
sql_query_info=SELECT*FROMpostWHEREid=$id
}#这行不需要修改
sourcesrclthrottled:
srcl#继承主数据源
主数据源索引:
indextext1
{
source=src1#索引源声明
charset_type=utf-8#数据编码(设置成utf8)
charset_table=#上面指定了utf-8,这里需要开启
}
增量索引
indextestlstemmed:
test1#先进行注释
indexdistl#分布式也注释掉
索引器设置
indexer
{
mem_limit=256M#内存大小限制默认是32M,推荐为256M
}#其他用默认即可
sphinx服务进程searchd的相关配置
searchd{
}#全部用默认的就可以了
如果是本地测试,使用默认就可以,如果是多个服务器测试需要指定监听的ip即可
#Sphinx配置文件结束
(6)、创建索引
Sphinx的配置文件配置完成,数据也导进去了,接下来就用下面命令来创建索引:
创建索引命令:
indexer
-c指定配置文件
--all对所有索引重新编制索引
--rotate用于轮换索引,主要是再不停止服务的时候,增加索引
--merge合并索引
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx.conf--all
创建索引是报了一个这样的错误:
/usr/local/sphinx/bin/indexer:
errorwhileloadingsharedlibraries:
libmysqlclient.so.16:
cannotopensharedobjectfile:
Nosuchfileordirectory
可以用下面方法解决:
locate libmysqlclient 运行该命令找到关于libmysqlclient.so.16的文件
然后把该文件的一个连接复制到在环境变量的文件夹/usr/lib/下
cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16
再次运行创建索引命令就能完成索引的创建了
出现这样的提示就表示创建成功
(7)、测试
检查数据命令:
search
/usr/local/sphinx/bin/search-c/usr/local/sphinx/etc/sphinx.conftest
可以看到将数据中含有test关键字的数据查询出来,包括文档id,权重,属性值等
我们搜索下中文看下。
/usr/local/sphinx/bin/search-c/usr/local/sphinx/etc/sphinx.conf'兄弟连'
找不到数据,为什么?
Coreseek-带有中文分词的Sphinx
Coreseek介绍:
Sphinx默认不支持中文索引及检索,基于Sphinx开发了Coreseek全文检索服务器,Coreseek应该是现在用的最多的Sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词
(1)、下载中文分词包
到官网去下载Coreseek相应的版本
(2)、解压安装
cd/lamp
tar -zxvf coreseek-3.2.14.tar.gz
进入到mmseg所在文件夹,先安装中文分词mmseg
cd/lamp/coreseek-3.2.14/mmseg-3.2.14/
./configure --prefix=/usr/local/mmseg
编译过程中报了一个config.status:
error:
cannotfindinputfile:
src/Makefile.in
这个的错误,然后运行下列指令再次编译就能通过了:
automake
然后再进行编译和安装:
make && make install
然后运行mmseg,就能输入安装成功的信息了:
/usr/local/mmseg/bin/mmseg
出现下列信息,就证明mmseg中文分词已经安装好了。
接下来,我们要把Sphinx和mmseg结合起来
(1)、检测安装
进入coreseek目录,进行安装
cd /lamp/coreseek-3.2.14/csft-3.2.14/
./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg=/usr/local/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
make&&makeinstall
(2)、配置带有中文分词的sphinx配置文件
配置文件和上面的步骤一样,只不过是在coreseek中,有几个地方需要注意。
注意:
coreseek中得配置文件也是csft.conf,而不是sphinx.conf
cd/usr/local/coreseek/etc
cpsphinx.conf.distcsft.conf
vimcsft.conf
其他地方都一样,对照下面不一样的地方修改
indextest1
{
#stopwords=G:
\data\stopwords.txt
#wordforms=G:
\data\wordforms.txt
#exceptions=/data/exceptions.txt
#charset_type=sbcs
添加下面这两行,意思是把中文分词加入到配置文件中
charset_type=zh_cn.utf-8
charset_dictpath=/usr/local/mmseg/etc/#你安装mmseg的目录
}
(3)、生成索引并测试
创建索引
/usr/local/coreseek/bin/indexer-c/usr/local/coreseek/etc/csft.conf--all
再次测试搜索中文
/usr/local/coreseek/bin/search[-a]-c/usr/local/coreseek/etc/csft.conf'兄弟连'
注意:
如果你设置的coreseek配置文件为csft.conf,则inder、search和searchd时不用带上-c/usr/local/coreseek/etc/csft.conf,因为默认就是去寻找这个文件.
我们在linux下Sphinx,中文分词已经安装完成了,并测试成功
如何用PHP去使用Sphinx技术
在这篇中我们使用php程序操作Sphinx做个小的站内搜素引擎
Sphinx集成到PHP程序中,有两种方式:
1.Sphinxphp模块
2.Sphinxapi类
我们要使用Sphinx需要做以下几件事:
1、首先得有数据
2、建立Sphinx配置文件
3、生成索引
4、启动Searchd服务进程,并开户端口9312
5、用PHP客户程序去连接Sphinx服务
一、启用sphinx服务
想要在程序中使用Sphinx必须开启Sphinx服务
启动进程命令:
searchd
-c#指定配置文件
--stop#是停止服务
--pidfile#用来显式指定一个PID文件
-p#指定端口
/usr/local/coreseek/bin/searchd-c/usr/local/coreseek/etc/csft.conf
注意:
这里启动的服务是searchd,不是search
Sphinx默认的端口是9312端口
如果出现这个问题:
说明端口已经被占用了,解决的办法是:
netstat--tunpl|grep9312找出进程ID,
kill-9进程id,再开启就可以了
二、用PHP连接使用Sphinx程序
(1)全PHP加载Sphinx模块
wget
tarzxfsphinx-1.1.0.tgz
cd/www/soft/sphinx-1.1.0
/usr/local/webserver/php/bin/phpize
./configure--with-php-config=/usr/local/webserver/php/bin/php-config
提示出错:
checkingforlibsphinxclientheadersindefaultpath...notfound
configure:
error:
Cannotfindlibsphinxclientheaders
找了下libsphinxclient,在/www/soft/csft-3.2.13/api/libsphinxclient,之前安装的是coreseek3.2.13版
cdlibsphinxclient/
./configure
make&&makeinstall
安装完libsphinxclient,继续安装sphinx扩展
cd/www/soft/sphinx-1.1.0
/usr/local/php/bin/phpize
./configure--with-php-config=/usr/local/php/bin/php-config
make &&makeinstall
cd/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
看到sphinx.so
vi/usr/local/webserver/php/etc/php.ini
加入extension=sphinx.so
/usr/local/apache2/bin/apachectlrestart
测试Sphinx模块,http:
//192.168.10.1/phpinfo.php
(2)、使用API类连接Sphinx程序
需要到coreseek解压包中找到sphinxapi.php文件,放到程序目录下
cp/lamp/coreseek-3.2.14/csft-3.2.14/api/sphinxapi.php/usr/local/apache2/htdocs/
include'sphinxapi.php';
//加载SphinxAPI
$sphinx=newSphinxClient();
#创建sphinx对象
$sphinx->SetServer("localhost",9312);
#建立连接,第一个参数sphinx服务器地址,第二个sphinx监听端口
$result=$sphinx->query($keyword,"*");
#执行查询,第一个参数查询的关键字,第二个查询的索引名称,多个索引名称用,分开,也可以用*表示全部索引,其中包括增量索引
print_r($result);
#打印结果
找到下面这一段,是我匹配的数据
[matches]=>Array(//匹配的结果
[6]=>Array
[weight]=>4
[attrs]=>Array
[group_id]=>1
[date_added]=>1319127367
#一个多维的数组,下标[6]是你匹配包含关键字的文档id,id对应的数组,[weight]是权重,[attrs]是属性,我们在配置文件中指定的
这段也是我们需要的数据
[total]=>2
#此查询在服务器检索所得的匹配文档总数
[total_found]=>2
#索引中匹配文档的总数
[time]=>0.009
#这个是我们这次查询所用的时间
[words]=>Array(
[兄弟]=>Array
[docs]=>2在文档中出现多少次(content字段中)
[hits]=>6一共出现多少次
[连]=>Array
[docs]=>2
[hits]=>6
(3)、取得数据摘要并高亮显示
Matches中就是我们匹配的结果,但是仿佛不是我们想要的数据,比如titile,content字段的内容就没有匹配出来,根据官方的说明是Sphinx并没有连接到MySQL去取数据,只是根据它自己的索引内容进行计算,因此如果想用Sphinx提供的API去取得我们想要的数据,还必须以查询的结果为依据,再次查询MySQL从而得到我们想要的数据
比如:
$mysqli=newmysqli("localhost","root","password","test");
$ids=join(',',array_keys($result['matches']));要把需要的id取出来。
$sql="selecttitle,contentfrompostwhereidin({$ids})”;
$result=$mysqli->query($sql);
while($row=$result->fetch_row()){
#循环体开始解析看下结果.
下面我们在输出结果的时候需要生成摘要,高亮(就是和XX一样,关键字飘红)我们需要用到buildExcerpts这个函数,(php手册中)语法格式:
publicarraySphinxClient:
:
buildExcerpts(array$docs,string$index,string
$words[,array$opts])
#返回的是一个数组,一共有四个参数
#第一个参数是从数据库中查询的结果集
#第二个参数是索引的名字
#第三个参数是要高亮显示的关键字
#第四个参数是显示的字格式化
$opts=array(
#格式化摘要,高亮字体设置
#在匹配关键字之前插入的字符串,默认是
"before_match"=>"bold;color:
red'>",
#在匹配关键字之后插入的字符串,默认是
"after_match"=>"",
#在摘要段落之前插入的字符串默认„
"chunk_separator"=>"...",
);
$res=$sphinx->buildExcerpts($row,"index",$keyword,$opts);
echo"".$res[0]."";标题
echo"".$res[1]."";摘要
echo$res[2]."
";添加时间
}
#循环体结束
到这里呢,我们用php程序调用sphinxapi实现了高亮摘要功能
三、匹配模式
匹配模式:
SetMatchMode(设置匹配模式)
原型:
functionSetMatchMode($mode)
SPH_MATCH_ALL匹配所有查询词(默认模式).
SPH_MATCH_ANY匹配查询词中的任意一个.
SPH_MATCH_PHRASE将整个查询看作一个词组,要求按顺序完整匹配.
SPH_MATCH_BOOLEAN将查询看作一个布尔表达式.
SPH_MATCH_EXTENDED将查询看作一个Sphinx内部查询语言的表达式.
SPH_MATCH_FULLSCAN使用完全扫描,忽略查询词汇.
SPH_MATCH_EXTENDED2类似SPH_MATCH_EXTENDED,并支持评分和权重
四、Sphinx实时索引
数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。
1、创建一个计数器
一个简单的实现是,在数据库中增加一个计数表,记录将文档集分为两个部分的文档ID,每次重新构建主索引时,更新这个表
先在mysql中插入一个计数表
CREATETABLEsph_counter(counter_idINTEGERPRIMARYKEYNOTNULL,max_doc_idINTEGERNOTNULL);
2、再次修改配置文件
主数据源,继承数据源,主索引,继承索引。
(继承索引也就是增量索引)。
主数据源里面:
我们需要把欲查询语句改成下面的语句:
Vi/usr/local/coreseek/etc/csft.conf
Sourcemain{
把sql_query_pre的改成下面的语句
sql_query_pre=REPLACEINTOsph_counterSELECT1,MAX(id)FROMpost
sql_query=\
SELECTid,title,contentFROMpost\
WHEREid<=(SELECTmax_doc_idFROMsph_counterWHEREcounter_id=1)
}
继承数据源:
sourcedelta:
main
{
sql_query_pre=SETNAMESutf8
sql_query
=\
SELECTid,title,contentFROMpost\
WHEREid>(SELECTmax_doc_idFROMsph_counterWHEREcounter_id=1)
}
主索引:
把名字该成想对应的
Indexmain{
source=main