分享下ThinkPHP中如何使用sphinx

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

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

时间: 2024-08-08 15:20:43

分享下ThinkPHP中如何使用sphinx的相关文章

ThinkPHP中使用ajax接收json数据的方法

本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先需要引入jquery.js,主要代码如下: 1 function ajax(id,pic){ 2 3 //由于ThinkPHP不解析JavaScript里的ThinkPHP常量,所以需要先在这里定义. 4 5 var URL='__URL__'; 6 7 $.ajax({ 8 9 url: URL+

ThinkPHP中的视图

ThinkPHP中的视图View 1.什么是视图View 所谓的视图就是用户可视化操作界面. 2.视图View组成 view类(模板引擎类似Smarty) 模板文件(html模板) 3.视图的定义 默认视图的定义规则: ./项目目录/Home或Admin模块下的View文件夹/Public控制器名称/login操作方法.html ① 在控制器中定义相关操作方法,如下图所示: ② 在./Application/Admin/View/Public文件夹下创建login.html模板文件 ③ 显示效果

ThinkPHP中的模型

ThinkPHP中的模型 1.什么是模型(Model) 模型表示企业数据和业务规则,实际项目开发中,主要实现与数据库进行操作. 2.模型的定义规则 模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型类的关键词Model,再加上类文件后缀.class.php 案例:实现移动办公自动化系统的组织结构功能 ① 设计数据库db_think ② 设计数据表结构(tk_dept) id ???? 编号 ????int 自动增长 主键 name 部门名称 varchar(4

ThinkPHP中 按条件查询后列表显示

最近在项目中遇到了需要根据下拉框的条件筛选出符合条件的数据,然后进行列表显示的问题. 在ThinkPHP中进行列表显示的传统过程:通过在后台控制器中查询出数据,然后通过$this->assign()来实现控制器数据向页面的传递,在页面中通过<foreach>或<volist>标签来进行数据的解析,(注:在通过标签进行数据的解析时需要以“$”符号的形式). 在进行条件查询时,需要通过jquery中ajax的方式将条件GET到后台控制器,后台控制器中接收数据,然后根据条件进行查询

ThinkPHP中的__initialize()和类的构造函数__construct()

ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对请更正.首先,我要说的是1.__initialize()不是php类中的函数,php类的构造函数只有__construct().2.类的初始化:子类如果有自己的构造函数(__construct()),则调用自己的进行初始化,如果没有,则调用父类的构造函数进行自己的初始化.3.当子类和父类都有__co

毕业一年,分享下个人的找工作的体会

应届生毕业季选择了一家国企IT中心干运维工作,工作一年觉得工作没什么挑战性,直接裸辞了,找了两个星期工作,面了5家公司,收到4个邀请 昨天正式入职第二家公司,工资给我开了年薪120K,当然还有其他些福利,薪资方面基本符合个人预期(10K-12K/月) 这份工作是做基础软件开发(开发给程序员使用的工具和软件),个人觉得这份工作很有挑战性毅然选择了这家公司 今天项目经理找我谈心,谈到他为什么会招我这个第一年工作中都没写过一行代码的人进这个项目组,核心的意思是他愿意提供给一位有潜力的年轻人一个机会,让

[转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如果实例化的是一个空模型 例如 $Demo = new Model(); 那么它等价于

ThinkPHP中实例化对象M()和D()的区别,select和find的区别

原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法.通俗一点说:M实例化参数是数据库的表名.D实例化的是你自己在Model文件夹下面建立的模型文件 例如:$user = new UserModel(); 等价于$user = D('user'); 如

ThinkPHP中邮件发送功能

初次使用thinkphp框架,开发一个邮件发送功能,由于对框架不熟悉折腾了几个小时终于成功了,以下是代码记录. 此函数只能在ThinkPHP中使用且需要phpmailer扩展的支持:phpmail的下载地址:https://code.google.com/a/apache-extras.org/p/phpmailer 将phpmailer解压后放置扩展放置到第三方类库扩展目录下: ThinkPHP/Extend/Vendor/文件夹下即可,并使用vendor方法来导入.更详细介绍参考:http: