sphinx搜索
2015.8.13
使用Mysql实现增加索引以实现加快数据搜索
1.增加索引,当你想对某个字段进行like查询或是关联查询时,添加该字段的索引
或是在phpMyAdmin中进行索引设置
ALTER TABLE `ecs_goods` ADD INDEX(`goods_sn`);
2.Sphinx实现索引快速搜索和全文检索
介绍:是一个基于SQL的全文检索引擎,它提供了比数据库更专业的搜索功能,并且sphinx特别为一些脚本语言设置了搜索的API接口,如:php,python等,同时为mysql也设计了一个存储引擎插件
centos下安装配置coreseek(http://www.centoscn.com/image-text/install/2015/0616/5675.html)
(并在thinkphp中使用)
yum install expat-devel*
cd /mycms/ThinkPHP/Lirary/Vendor/ (thinkphp项目的目录)
tar xzvf coreseek-3.2.14.tar.gz
cd coreseek-3.2.14
cd mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3
make && make install
cd ..
cd csft-3.2.14
wget -O - http://blog.atime.me/static/resource/sphinxexpr-gcc4.7.patch.gz | gzip -d - | patch -p0(防止下面make中出现ExprEval错误)
或者
直接修改src/sphixexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval
参考http://blog.atime.me/note/sphinx-coreseek-summary.html
直接修改src/sphixexpr.cpp文件的1746, 1777和1823行,将三行中的ExprEval改为this->ExprEval
参考http://blog.atime.me/note/sphinx-coreseek-summary.html
sh buildconf.sh
./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
yum install mysql-devel libxml2-devel expat-devel
)
make && make install
cd ..
cd testpack
配置csft_mysql.conf文件
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库#源定义source mysql{ type = mysql sql_host = localhost sql_user = root sql_pass = 123456 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_query第一列id需为整数 #title、content作为字符串/文本字段,被全文索引 sql_attr_uint = group_id #从SQL读取到的值必须为整数 sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性 sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集 sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息}#index定义index mysql{ source = mysql #对应的source名称 path = /var/lib/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... docinfo = extern mlock = 0 morphology = none min_word_len = 1 html_strip = 0 #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/ charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾 #charset_dictpath = etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/... charset_type = zh_cn.utf-8}#全局index定义indexer{ mem_limit = 128M}#searchd服务定义searchd{ listen = 9312 read_timeout = 5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... log = /var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/... query_log = /var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...} /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all(成功后将在var/date目录中生成文件)
/usr/local/coreseek/bin/search -c etc/csft_mysql.conf 网络搜索(普通搜索测试)
正常开启搜索服务
/usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf(将该搜索服务设为进程服务)
/usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf(将该搜索服务设为进程服务)
如要停止搜索服务,请使用
/usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf --stop
/usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf --stop
如要已启动服务,要更新索引,请使用
/usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all --rotate
/usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all --rotate
publicfunction search(){header("Content-type:text/html;charset=UTF-8");$keyword = $_GET['kw'];Vendor('Coreseek.api.sphinxapi');//此处为coreseek中sphinxapi.php文件的目录一般为 coreseek-3.2.14.testpack.api.sphinxapi//$s = new \SphinxClient;//加载第三方扩展包的文件 文件名不包含class$db = M();$spx =new \SphinxClient();//实例化SphinxClient$spx ->SetServer('127.0.0.1',9312);//设置ip和端口$spx->SetConnectTimeout(5);//设置超时时间$spx->SetArrayResult(true);if(strlen($keyword)>=18){$spx ->SetMatchMode(SPH_MATCH_ALL);//如果用户查询字符大于=18个匹配有查询词}else{$spx ->SetMatchMode(SPH_MATCH_ANY);//匹配查询词中的任意一个}//------/*$limit = 12;//每页要显示的数量$page = $_GET['page']>1 ? $_GET['page'] : 1;//GET值不为1 则按1算//$spx->setLimits(0,12);$off = ($page-1)*$limit;$spx->SetLimits( $off, $limit);*///设置分页$spx->SetLimits(0,12);//设置查询出多少条数据$result = $spx -> query("{$keyword}");//print_r($result);/** 取出matches中的id,组成字符串*/$str ='';foreach($result['matches']as $rrs){$str.=$rrs['id'].',';}$ids = rtrim($str,',');//dump($result['matches']);//dump($result);//操作数据库$sql ="SELECT * FROM cms_post where id in ({$ids})";$stmt = $db->query($sql);//循环拼接html并返回$html="";$x=1;foreach($stmt as $u=>$j){$html.="<tr><td style='text-align: center;'>".$x."</td>";$html.="<td style='text-align: center;'>". $j['title']."</td>";$html.="<td style='text-align: center;'>". $j['content']."</td>";$html .="</tr>";$x++;}$res['html']= $html;$this->ajaxReturn($res);}
浙公网安备 33010602011771号