码迷,mamicode.com
首页 > Web开发 > 详细

分享下ThinkPHP中如何使用sphinx

时间:2015-07-24 22:22:44      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:

前一段时间工作中遇到的一些小问题,在网上找了很久,thinkphp是没有sphinx扩展的,那么我们可以自己扩展一个用,今天搞了好久,只能总结一点thinkphp调用sphinxapi的一段小代码
首先我们把coreseek下载好,命名为coreseek,我们找到coreseek/etc中的csft_mysql.conf修改这个配置文件

  1. #源定义
  2.     source lemai
  3.     {
  4.     type                    = mysql
  5.     sql_host                = localhost
  6.     sql_user                = root
  7.     sql_pass                = 123
  8.     sql_db                    = lemai
  9.     sql_port                = 3306
  10.     sql_query_pre            = SET NAMES utf8
  11.     sql_query                = SELECT id, title,content,name FROM shop
  12.     #sql_query第一列id需为整数
  13.     #title、content作为字符串/文本字段,被全文索引
  14.     sql_attr_uint            = sid           #从SQL读取到的值必须为整数
  15.     sql_attr_timestamp        = time #从SQL读取到的值必须为整数,作为时间属性
  16.     sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
  17.     sql_query_info            = SELECT * FROM shop WHERE name=$id #命令行查询时,从数据库读取原始数据信息
  18.     }
  19.     #index定义
  20.     index lemai
  21.     {
  22.     source            = lemai             #对应的source名称
  23.     path            = var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
  24.     docinfo            = extern
  25.     mlock            = 0
  26.     morphology        = none
  27.     min_word_len        = 1
  28.     html_strip                = 0
  29.     #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
  30.     #charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
  31.     charset_dictpath = C:/AppServ/www/thinkphp/ThinkPHP/Extend/Vendor/Coreseek/etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
  32.     charset_type        = zh_cn.utf-8
  33.     #charset_table      =
  34.     ngram_len            = 0
  35.     }
  36.     #全局index定义
  37.     indexer
  38.     {
  39.     mem_limit            = 128M
  40.     }
  41.     #searchd服务定义
  42.     searchd
  43.     {
  44.     listen                  =   9312
  45.     read_timeout        = 5
  46.     max_children        = 30
  47.     max_matches            = 1000
  48.     seamless_rotate        = 0
  49.     preopen_indexes        = 0
  50.     unlink_old            = 1
  51.     pid_file = var/log/searchd_mysql.pid  #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
  52.     log = var/log/searchd_mysql.log        #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
  53.     query_log = var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
  54.     }



然后把coreseek拷贝一份到thinkphp的核心文件Extend/Vendor下.
打开cmd  cd到coreseek

bin\indexer -c etc\csft_mysql.conf (mysql,等)数据库名 创建索引
创建完之后我们可以在var\data下看到一堆文件,此时说明创建成功

bin\searchd -c etc\csft_mysql.conf --console   启动进程
(检查端口9312是否有这个进程,有就OK)


命令行查询
echo 一号店 |iconv -f gbk -t utf-8 | search -c etc\csft_mysql.conf --stdin | iconv -f utf-8 -t gbk     中文索引查询
然后就可以在控制器中进行PHP连接sphinxapi进行测试了

  1. Vendor(‘Coreseek.api.sphinxapi‘);
  2.     //加载第三方扩展包的文件  文件名不包含class
  3.     $db = new PDO(‘mysql:host=localhost;port=3306;dbname=lemai‘, ‘root‘, ‘123‘, array( PDO::MYSQL_ATTR_INIT_COMMAND => ‘SET NAMES UTF8‘));
  4.     //实例化PDO
  5.     $spx = new SphinxClient();
  6.     //实例化SphinxClient
  7.     $spx -> SetServer(‘127.0.0.1‘,9312);
  8.     $spx->SetConnectTimeout ( 3 );
  9.     $spx->SetArrayResult ( true );
  10.     $spx -> SetMatchMode(SPH_MATCH_ANY);
  11.     $result = $spx -> query(‘1‘,‘*‘);
  12.     $ids = join(",",array_keys($result[‘matches‘]));
  13.     $sql = "SELECT * FROM shop where id in ({$ids})";
  14.     $stmt = $db->query($sql);
  15.     $r = $stmt->FETCHALL(PDO::FETCH_ASSOC);
  16.     echo "<pre>";
  17.     var_dump($r);





以下是我的实例代码  包括sphinx分页

  1. class IndexAction extends Action {
  2.    public function index(){
  3.         header("Content-type:text/html;charset=utf-8");
  4.         //设置字符集
  5.         
  6.         $keyword = $_GET[‘kw‘];
  7.         Vendor(‘Coreseek.api.sphinxapi‘);
  8.         //加载第三方扩展包的文件  文件名不包含class
  9.         $db = M();
  10.         $spx = new SphinxClient();
  11.         //实例化SphinxClient
  12.         
  13.         $spx -> SetServer(‘127.0.0.1‘,9312);
  14.         //设置ip和端口
  15.         
  16.         $spx->SetConnectTimeout ( 3 );
  17.         //设置超时时间
  18.         
  19.         
  20.         $spx->SetArrayResult ( true );
  21.         if(strlen($keyword)>=18){
  22.             $spx -> SetMatchMode(SPH_MATCH_ALL);//如果用户查询字符大于=18个匹配有查询词
  23.         }else{
  24.             $spx -> SetMatchMode(SPH_MATCH_ANY);//匹配查询词中的任意一个
  25.         }
  26.         //------
  27.         $limit = 12;//每页要显示的数量
  28.         $page = $_GET[‘page‘]>1 ? $_GET[‘page‘] : 1;
  29.         //GET值不为1 则按1算
  30.         
  31.         //$spx->setLimits(0,12);
  32.         $off = ($page-1)*$limit;
  33.         $spx->SetLimits( $off, $limit);
  34.         //设置分页
  35.         
  36.         $result = $spx -> query("{$keyword}",‘*‘);
  37.         
  38.         /*
  39.         * 取出matches中的id,组成字符串
  40.         */
  41.         $str = ‘‘;
  42.         foreach($result[‘matches‘] as $rrs){
  43.              $str.=$rrs[‘id‘].‘,‘;
  44.          }
  45.         $ids = rtrim($str,‘,‘);
  46.         
  47.         //操作数据库
  48.         $sql = "SELECT * FROM shop where id in ({$ids})";
  49.         $stmt = $db->query($sql);
  50.         
  51.         $opts = array(
  52.             "before_match"=>"<span style=‘color:red‘>",//添加样式
  53.             "after_match"=>"</span>"    
  54.         );
  55.         foreach($stmt as $st){
  56.                 $shop_all[] = $spx->buildExcerpts($st,‘lemai‘,$keyword,$opts);
  57.         }
  58.         
  59.         $num = $result[‘total‘];
  60.         $count =ceil($result[‘total‘]/12);//查出sphinx搜索总数  得出该关键词分页数
  61.         $pagenum = $_GET[‘page‘]>1?$_GET[‘page‘]:1;
  62.         
  63.         
  64.         $this->assign(‘pagenum‘,$pagenum);
  65.         $this->assign(‘num‘,$num);
  66.         $this->assign(‘count‘,$count);
  67.         $this->assign(‘shop_all‘,$shop_all);
  68.         $this->assign(‘keyword‘,$keyword);    
  69.         $this->display("seek");    
  70.             }
  71.         }

欢迎大家来我的博客一起探讨成长:清林博客 
原文链接地址:ThinkPHP中如何使用coreseek(sphinx) 

分享下ThinkPHP中如何使用sphinx

标签:

原文地址:http://www.cnblogs.com/yueryuermaomao/p/4674631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!