首先要建立一个配置文件,比如叫sphinx.conf,这个配置文件的模板可以在etc目录下找到,链接mysql的话,就用csft_mysql.conf这个文件来修改就行
1 #源定义 2 source songs 3 { 4 type = mysql 5 6 sql_host = localhost 7 sql_user = root 8 sql_pass = 9 sql_db = test 10 sql_port = 3306 11 sql_query_pre = SET NAMES utf8 12 13 sql_query = select id,title,content from curl_songs 14 #sql_query第一列id需为整数 15 #title、content作为字符串/文本字段,被全文索引 16 #sql_attr_uint = group_id #从SQL读取到的值必须为整数 17 #sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性 18 19 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 20 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 21 } 22 23 #index定义 24 index songs 25 { 26 source = songs #对应的source名称 27 path = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\var\data\songs #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... 28 docinfo = extern 29 mlock = 0 30 morphology = none 31 min_word_len = 1 32 html_strip = 0 33 34 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ 35 #charset_dictpath = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\etc #BSD、Linux环境下设置,/符号结尾 36 charset_dictpath = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\etc #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... 37 charset_type = zh_cn.utf-8 38 } 39 40 #全局index定义 41 indexer 42 { 43 mem_limit = 128M 44 } 45 46 #searchd服务定义 47 searchd 48 { 49 listen = 9312 50 read_timeout = 5 51 max_children = 30 52 max_matches = 1000 53 seamless_rotate = 0 54 preopen_indexes = 0 55 unlink_old = 1 56 pid_file = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\var\log\searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... 57 log = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\var\log\searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... 58 query_log = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\var\log\query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... 59 }
之后,在每次使用之前,必须启动sphinx的服务
即bin文件下的searchd,启动时,要携带配置文件,命令如下
1 F:\wamp\bin\sphinx\coreseek-3.2.14-win32\bin\searchd.exe 2 -c F:\wamp\bin\sphinx\coreseek-3.2.14-win32\sphinx.conf
这样sphinx就启动了,
然后,对要进行查询的数据源文件,必须建立好索引,需要用到sphinx bin下面的indexer文件
C:\Users\Administrator>F:\wamp\bin\sphinx\coreseek-3.2.14-win32\bin\indexer.exe -c F:\wamp\bin\sphinx\coreseek-3.2.14-win32\sphinx.conf songs --all
然后就可以用php才操作sphinx了
1 <?php 2 //引入sphinx api类 3 include 'sphinxapi.php'; 4 $s=new SphinxClient(); 5 $s->SetServer('localhost',9312); 6 //设置搜索的内容,word 7 $word=empty($_GET['search']) ? '' : $_GET['search']; 8 //执行查询,songs为数据源的名字 9 $res=$s->Query($word,'songs'); 10 if($res){ 11 //list里面存储查询到的id 12 $list=array_keys($res['matches']); 13 $list=implode(',', $list); 14 15 16 //开始mysql查询部分 17 mysql_connect('localhost','root','',3306); 18 mysql_select_db('test'); 19 $sql="select * from curl_songs where id in ($list)"; 20 mysql_query('set names utf8'); 21 $res=mysql_query($sql) or die(mysql_error()); 22 23 while ($row=mysql_fetch_assoc($res)){ 24 //这个buildExcerpts方法,可以对结果进行文档标注,比如对搜到的关键字进行红色标注,比较实用 25 //但实用之后,结果的数据就不是关联数组了,就成为索引数组,要用arr[0] arr[1]等来取值 26 $arr[]=$s->BuildExcerpts($row, 'songs', $word, array( 27 'before_match'=>'<font color="red">', 28 'after_match'=>'</font>', 29 'limit'=>'200' 30 )); 31 } 32 33 } 34 //总共消耗的时间 35 $costtime=empty($res['time']) ?'0.00' : $res['time']; 36 //一共查询到了多少条 37 $totalfound=empty($res['total_found']) ? '0' : $res['total_found']; 38 //页面显示部分 39 ?> 40 <html> 41 <meta charset='utf-8'></meta> 42 <body> 43 <form method='get' > 44 <input type='text' name='search' value="<?php echo $word ?>" /> <button >搜索</button> <br> 45 共有<?php echo $totalfound ?>条记录,消耗时间<?php echo $costtime ?>秒 46 47 <?php 48 if (!empty($arr)) { 49 echo "<ul>"; 50 foreach ($arr as $v){ 51 echo '<li><hr>'.$v[1] .' 演唱:'.$v[2].'</li>'; 52 echo '<li><p>'. $v[3] .'</p><br></li></ul>'; 53 } 54 } 55 ?> 56 </form> 57 </body> 58 </html>
--->sphinx应用后对应有个增量索引的东西,就是索引建立好后,当数据有更新,如果每次重新生成索引相当的费时不现实
步骤,主数据源为songs 增加的为songs_add
首先要在mysql下建立一张表,目的存储songs这个索引的最大id,其实就是相当于一个变量的作用
1 create table a( 2 id int unsigned primary key ,max_id int unsigned default '' 3 )
然后就是修改sphinx.conf这个文件,首先
在原来的数据源 songs 中 要加入这一句
意思就是在主查询完毕之后,插入songs表最大的id到a表中记录好,replace作用是无数据就插入,有数据就更新
1 sql_query = select id,title,content from curl_songs 2 sql_query_post = replace into a select 1,max(id) from curl_songs
然后建立songs_add部分的数据源和索引
1 #源定义 2 source songs_add 3 { 4 type = mysql 5 6 sql_host = localhost 7 sql_user = root 8 sql_pass = 9 sql_db = test 10 sql_port = 3306 11 sql_query_pre = SET NAMES utf8 12 13 sql_query = select id,title,content from curl_songs where id >( select max_id from a) 14 sql_query_post =replace into a select 1,max(id) from curl_songs 15 16 17 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 18 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息 19 } 20 21 #index定义 22 index songs_add 23 { 24 source = songs_add #对应的source名称 25 path = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\var\data\songs_add #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... 26 docinfo = extern 27 mlock = 0 28 morphology = none 29 min_word_len = 1 30 html_strip = 0 31 32 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ 33 #charset_dictpath = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\etc #BSD、Linux环境下设置,/符号结尾 34 charset_dictpath = F:\wamp\bin\sphinx\coreseek-3.2.14-win32\etc #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... 35 charset_type = zh_cn.utf-8 36 }
配置文件设置好之后就开始运行
(1):生成songs的索引(必须重新生成一次,这样a表中就会记录最大id)
1 F:\wamp\bin\sphinx\coreseek-3.2.14-win32\bin\indexer.exe 2 -c F:\wamp\bin\sphinx\coreseek-3.2.14-win32\sphinx.conf songs
(2):生成songs_add的索引
1 F:\wamp\bin\sphinx\coreseek-3.2.14-win32\bin\indexer.exe 2 -c F:\wamp\bin\sphinx\coreseek-3.2.14-win32\sphinx.conf songs_add
(3)合并这两个索引即可
1 F:\wamp\bin\sphinx\coreseek-3.2.14-win32\bin\indexer.exe 2 -c F:\wamp\bin\sphinx\coreseek-3.2.14-win32\sphinx.conf --merge songs song_add --rotate
可以设置一个自动的脚本或linux下的计划任务,让索引更新在比如每天晚上2天自动更新