从sphinx网站下载sphinx源码包,当前稳定版本是:http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
一、安装
步骤如下:
放在任意目录下,解压sphinx源码包:
$ tar xzvf sphinx-0.9.9.tar.gz
$ cd sphinx
运行configure配置程序:
$ ./configure [options]
参数配置的时候指定,主要如下:
--prefix , 指定sphinx安装到系统的那个位置; 例如 --prefix=/usr/local/sphinx
--with-mysql, mysql的安装目录,指定如果自动侦查mysql的相关库文件失败后到哪个目录查找
--with-pgsql, 同上,只是用于pgsql的。
配置示例:./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql
其他配置参数:
--with-mysql=/usr/local/mysql/
--with-mysql-includes=/usr/local/mysql/include/mysql/
--with-mysql-libs=/usr/local/mysql/lib/mysql/
--with-mmseg=/usr/local/mmseg/
--with-mmseg-includes=/usr/local/mmseg/include/mmseg/
--with-mmseg-libs=/usr/local/mmseg/lib/
编译:
$ make
在这个步骤,可能遇到一个问题,就是报 sphinx undefined reference to 'libiconv' 的错误,解决办法是修改 /src/MakeFile(注意 是src下的Makefile不是csft下的Makefile),编辑LIBS = -lm -lexpat 后面添加-liconv,即将该行该为:
LIBS = -lm -lexpat -liconv -L/usr/local/lib
安装
$ make install
如果编译中没有产生错误,这个步骤应该不会遇到问题。如果完成后未正确安装,就要回去找make过程中遇到的错误了。
二. 配置
1、编写配置文件
vim /usr/local/sphinx/etc/csft.cnf
把其中的数据库信息修改自己mysql服务器信息,同时不要忘了修改相应的表名前缀。
2、建立sph_counter,在数据库中执行以下语词
CREATE TABLE IF NOT EXISTS `sph_counter` (
`counter_id` int(10) NOT NULL,
`max_doc_id` int(10) NOT NULL,
PRIMARY KEY (`counter_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
三、运行sphinx
1、生成索引文件
索引文件是检索的根据,如果数据量大的话,第一次运行速度会比较慢
执行以下命令:
/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --all
2、运行sphinx进程
/usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf
3、加入crontab计划任务
这样的目的是每分钟自动更新索引,以保证检索引擎可以获得最新的数据
vim /etc/crontab
加上以下内容:
# Incremental Index posts data
* 0-3 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf posts_minute --rotate
* 6-23 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf posts_minute --rotate
0 4 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf posts_merge --rotate && /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --merge posts posts_merge --rotate
# Incremental Index threads data
* 0-3 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf threads_minute --rotate
* 6-23 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf threads_minute --rotate
0 4 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf threads_merge --rotate && /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf --merge threads threads_merge --rotate#
四、测试搜索
通过Sphinx自带的search(在bin/目录)就可以在命令行进行搜索:
cd /usr/local/sphinx
./bin/search -c sphinx.conf test
运行后,系统提示一堆信息:
....
....
words:
1. 'test': 36 documents, 123 hits
这个表示库中有36条记录符合要求,出现test的有123处。
五、应用程序接口
应用程序如果想调用Sphinx,可以从两个方面:
一是通过Sphinx官方提供的API接口(有Python,Java,Php三种版本)
二是通过安装SphinxSE,然后创建一个中介sphinxSE类型的表,再通过执行特定的SQL语句实现。
通过官方API调用Sphinx(以PHP为例)在sphinx安装目录有一个API目录,里面有三个PHP文件:test.php,test2.php和sphinxapi.php。sphinxapi.php是sphinx调用接口封装文件,test.php是一个在命令行下执行的查询例子文件,test2.php是一个生成摘要的例子文件。
在命令下行运行test.php(Linux上没有API目录,需要从源程序包中复制api目录至/usr/local/sphinx)
Linux上(假设php在/usr/local/php目录,sphinx.conf在/usr/local/sphinx目录):
cd /usr/local/sphinx
/usr/local/php/bin/php api/test.php -i cgfinal test
Sphinx的API查询接口主要有这些内容(其实对照 一下sphinxapi.php就清楚了):
PHP:
//创建Sphinx的客户端接口对象
$cl = new SphinxClient ();
//设置连接Sphinx主机名与端口
$cl->SetServer('localhost',3312);
//可选,为每一个全文检索字段设置权重,主要根据你在sql_query中定义的字段的顺序,Sphinx系统以后会调整,可以按字段名称来设定权重
$cl->SetWeights ( array ( 100, 1 ) );
//设定搜索模式,SPH_MATCH_ALL,SPH_MATCH_ANY,SPH_MATCH_BOOLEAN,SPH_MATCH_EXTENDED,SPH_MATCH_PHRASE
$cl->SetMatchMode(SPH_MATCH_ALL);
//设定过滤条件$attribute是属性名,相当于字段名(用SPH_MATCH_EXTENDED时),$value是值,$exclude是布尔型,
当为true时,相当于$attribute!=$value,默认值是false