sphinx搜索

2015.8.13

使用Mysql实现增加索引以实现加快数据搜索
 
1.增加索引,当你想对某个字段进行like查询或是关联查询时,添加该字段的索引
或是在phpMyAdmin中进行索引设置
ALTER TABLE `ecs_goods` ADD INDEX(`goods_sn`);
2.Sphinx实现索引快速搜索和全文检索
 
介绍:是一个基于SQL的全文检索引擎,它提供了比数据库更专业的搜索功能,并且sphinx特别为一些脚本语言设置了搜索的API接口,如:php,python等,同时为mysql也设计了一个存储引擎插件
 
(并在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
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 --stop
如要已启动服务,要更新索引,请使用
/usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all --rotate

mysql数据源的配置可参考testpack/etc/csft_mysql.conf文件

vi etc/csft_mysql.conf

 

 

在项目控制器中调用该接口

  1. publicfunction search(){
  2. header("Content-type:text/html;charset=UTF-8");
  3. $keyword = $_GET['kw'];
  4. Vendor('Coreseek.api.sphinxapi');//此处为coreseek中sphinxapi.php文件的目录一般为 coreseek-3.2.14.testpack.api.sphinxapi
  5. //$s = new SphinxClient;
  6. //加载第三方扩展包的文件 文件名不包含class
  7. $db = M();
  8. $spx =new SphinxClient();
  9. //实例化SphinxClient
  10. $spx ->SetServer('127.0.0.1',9312);
  11. //设置ip和端口
  12. $spx->SetConnectTimeout(5);
  13. //设置超时时间
  14. $spx->SetArrayResult(true);
  15. if(strlen($keyword)>=18){
  16. $spx ->SetMatchMode(SPH_MATCH_ALL);//如果用户查询字符大于=18个匹配有查询词
  17. }else{
  18. $spx ->SetMatchMode(SPH_MATCH_ANY);//匹配查询词中的任意一个
  19. }
  20. //------
  21. /*$limit = 12;//每页要显示的数量
  22. $page = $_GET['page']>1 ? $_GET['page'] : 1;
  23. //GET值不为1 则按1算
  24. //$spx->setLimits(0,12);
  25. $off = ($page-1)*$limit;
  26. $spx->SetLimits( $off, $limit);*/
  27. //设置分页
  28. $spx->SetLimits(0,12);//设置查询出多少条数据
  29. $result = $spx -> query("{$keyword}");
  30. //print_r($result);
  31. /*
  32. * 取出matches中的id,组成字符串
  33. */
  34. $str ='';
  35. foreach($result['matches']as $rrs){
  36. $str.=$rrs['id'].',';
  37. }
  38. $ids = rtrim($str,',');
  39. //dump($result['matches']);
  40. //dump($result);
  41. //操作数据库
  42. $sql ="SELECT * FROM cms_post where id in ({$ids})";
  43. $stmt = $db->query($sql);
  44. //循环拼接html并返回
  45. $html="";
  46. $x=1;
  47. foreach($stmt as $u=>$j){
  48. $html.="<tr><td style='text-align: center;'>".$x."</td>";
  49. $html.="<td style='text-align: center;'>". $j['title']."</td>";
  50. $html.="<td style='text-align: center;'>". $j['content']."</td>";
  51. $html .="</tr>";
  52. $x++;
  53. }
  54. $res['html']= $html;
  55. $this->ajaxReturn($res);
  56. }
 



原文地址:https://www.cnblogs.com/kinmos/p/6829820.html