PHP搜索优化 sphinx 搭建测试
安装。环境:win7 64位
1、下载sphinx文件包
下载地址:http://sphinxsearch.com/downloads/archive/
2、解压到D:/sphinx。新建文件夹data 和 log,在本地test库中,导入example.sql文件。结构如下
3、配置 复制sphinx.conf.in文件到bin目录下。重命名为sphinx.conf。配置内容如下。每一行代表什么意思,目前我也说不清楚,后续吧...
注意两点:红色为我修改过的内容,黄底的地方,命名需要一致。
# 配置数据源 source src1 { type = mysql sql_host = localhsot sql_user = root sql_pass = sql_db = test sql_port = 3306 sql_query_pre = SET NAMES utf8 sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents sql_attr_uint = group_id sql_attr_timestamp = date_added sql_ranged_throttle = 0 } source src1throttled : src1 { sql_ranged_throttle = 100 } # 配置数据源生成的索引文件存放的位置 index test1 { source = src1 path = D:/sphinx/data/test1 # 注意此处包含生成的文件路径和名称。会在data目录下生成test1.***格式的文件 charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F docinfo = extern dict = keywords mlock = 0 morphology = none min_word_len = 1 ngram_len = 1 ngram_chars = U+3000..U+2FA1F html_strip = 0 } indexer { mem_limit = 128M } # 配置Sphinx服务器的信息 searchd { listen = 9312 listen = 9306:mysql41 log = D:/sphinx/log/searchd.log query_log = D:/sphinx/log/query.log read_timeout = 5 client_timeout = 300 max_children = 30 persistent_connections_limit = 30 pid_file = D:/sphinx/log/searchd.pid preopen_indexes = 1 unlink_old = 1 mva_updates_pool = 1M max_packet_size = 8M max_filters = 256 max_filter_values = 4096 max_batch_queries = 32 workers = threads
# windows下启动searchd服务一定要注释掉这个
# seamless_rotate = 1
}
4、建立索引
indexer.exe test1
5、启动服务
searchd.exe --pidfile
或者
searchd
也可以制作成.bat文件,方便快速启动。新建文件“测试.bat”,用文本编辑器打开,写入如下内容。可以根据自己环境,自行修改。双击即可启动sphinx
@echo off d: cd\sphinx/bin searchd
6、如果需要关闭服务,直接关闭DOC窗口
7、(拓展)php安装sphinx拓展就大概说一下。也可以不安装拓展,代码中引入文件即可
require('sphinxapi.php');
ext下加入dll文件
下载地址:http://pecl.php.net/package/sphinx
php.ini下配置。重启apache
extension=php_sphinx.dll
到此配置结束。
测试用例1。输出符合搜索关键词的ID
<?php
# 如果php中安装了sphinx.dll拓展,则不需要这一行代码
require('sphinxapi.php');
$keyword = 'test'; $sphinx = new SphinxClient; $sphinx->setServer("localhost", 9312); $sphinx->setMatchMode(SPH_MATCH_ANY); //匹配模式 ANY为关键词自动拆词,ALL为不拆词匹配(完全匹配) $sphinx->SetArrayResult ( true ); //返回的结果集为数组 $result = $sphinx->query($keyword,"test1"); //星号为所有索引源 $count=$result['total']; //查到的结果条数 $time=$result['time']; //耗时 $arr=$result['matches']; //结果集 $id=''; for($i=0;$i<$count;$i++){ $id.=$arr[$i]['id'].','; } $id=substr($id,0,-1); //结果集的id字符串 echo $id;
结果展示:
测试用例2。符合搜索关键词高亮
<?php # 如果php中安装了sphinx.dll拓展,则不需要这一行代码
require('sphinxapi.php'); $keyword = 'test'; $sphinx = new SphinxClient(); $sphinx->SetServer('localhost',9312); $sphinx->setMatchMode(SPH_MATCH_ANY);//匹配模式 SPH_MATCH_ALL:完全匹配 $result = $sphinx->query($keyword,'*');//*表示在所有索引里面进行搜索 $ids = implode(',',array_keys($result['matches'])); $conn = mysqli_connect('localhost','root',''); mysqli_query($conn,'set names utf8'); mysqli_select_db($conn,'test'); $sql = "select * from documents where id in (".$ids.")"; $rst = mysqli_query($conn,$sql); //给匹配关键字添加样式 $opts = array( 'before_match'=>'<font style="font-weight:bold;color:#f00;">', 'after_match'=>'</font>' ); echo '<pre>'; while($row = mysqli_fetch_assoc($rst)){ $row2 = $sphinx->buildExcerpts($row,'test1',$keyword,$opts);//test1 配置文件中的主数据源索引 print_r($row2); }
结果展示
用定时任务,自动更新索引,可以参考网址:http://v9.help.phpcms.cn/html/2010/search_0919/35.html