设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

QQ登录

只需一步,快速开始

#公告#抱歉,网站将关闭,不再开放。由于PC时代已远逝 。在这个后移动互联网时代,我们继续携手前行,保持对技术的热情。共同构建linuxtone知识星球欢迎加入,一起讨论技术、招聘人才、分享资源。请新老linuxtone人 扫码移步到 知识星球:linuxtone

学习是一种信仰!分享是一种快乐!能力= 心态 * 沟通 * 知识 (你的每一天需要正能量!)

 网站的发展需要你贡献一份力量!希望你能每天坚持看贴1小时,并回答网友的问题!祝你在浏览论坛的过程中取得进步!谢谢!linuxtone加油!大家加油! 友情提示: 你今天学习了吗?你今天进步了吗?少一点抱怨!多一点进步!Life is short ! Why not linuxtone ?  

网站的发展、感谢每位坛友的努力!

查看: 17507|回复: 22

[php] LinuxTone的搜索服务基于Sphinx的实例解析   [复制链接]

LT管理团队

想飞的鸟

Rank: 9Rank: 9Rank: 9

签到
223
注册时间
2008-6-20
最后登录
2015-7-7
在线时间
594 小时
阅读权限
200
积分
23002
帖子
512
主题
83
精华
3
UID
95
发表于 2010-10-24 00:28:27 |显示全部楼层
LinuxTone的搜索服务是基于coreseek3.2中文支持的sphinx而搭建的,搭建过程比较简单,大家可以去http://www.coreseek.cn/news/7/58/查看安装过程

  这里我主要讲重点,第一个是基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置
  1. #
  2. # LinuxTone full index search configure file
  3. #

  4. source lt_posts
  5. {
  6.         type                                      = mysql
  7.         sql_host                                = 127.0.0.1
  8.         sql_user                                = root
  9.         sql_pass                                =
  10.         sql_db                                   = lt_bbs
  11.         sql_port                                 = 3306        
  12.         sql_query_pre                        = SET NAMES utf8
  13.         sql_query                              = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1  #此处是基于posts表来做索引的,这样的目的是可以同时检索到subject,message,author 三个字段的值
  14.         sql_attr_uint                            = fid
  15.         sql_attr_timestamp                   = dateline
  16.         sql_query_info                          = SELECT * FROM cdb_posts WHERE pid=$id
  17. }
  18. index lt_posts
  19. {
  20.         source                                     = lt_posts
  21.         path                                        = /data/sphinx/data/lt_posts
  22.         docinfo                                    = extern
  23.         mlock                                       = 0
  24.         morphology                              = none
  25.         min_word_len                           = 2
  26.         html_strip                                = 1
  27.         charset_dictpath                       = /usr/local/mmseg-3.2.13/etc/
  28.         charset_type                            = zh_cn.utf-8
  29.         ngram_len                                = 0
  30. }

  31. ########## 增量索引 ##################
  32. source delta
  33. {
  34.         type                                      = mysql
  35.         sql_host                                = 127.0.0.1
  36.         sql_user                                = root
  37.         sql_pass                                =
  38.         sql_db                                   = lt_bbs
  39.         sql_port                                = 3306  # optional, default is 3306
  40.         sql_query_pre                        = SET NAMES utf8
  41.         sql_query                              = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1 and dateline > unix_timestamp()-3600*10 #增量索引采用当前时间戳减去一个需要间隔的时间来新建新增的数据索引

  42.         sql_attr_uint                          = fid
  43.         sql_attr_timestamp                 = dateline
  44.         sql_query_info                        = SELECT * FROM cdb_posts WHERE pid=$id
  45. }
  46. index delta
  47. {
  48.         source                                     = delta
  49.         path                                        = /data/sphinx/data/lt_delta
  50.         docinfo                                    = extern
  51.         mlock                                       = 0
  52.         morphology                              = none
  53.         min_word_len                           = 2
  54.         html_strip                                = 1
  55.         charset_dictpath                       = /usr/local/mmseg-3.2.13/etc/
  56.         charset_type                            = zh_cn.utf-8
  57.         ngram_len                                = 0

  58. }
  59. indexer
  60. {
  61.         mem_limit                                = 32M
  62. }
  63. searchd
  64. {
  65.         port                                        = 9312
  66.         log                                          = /data/sphinx/var/log/searchd.log
  67.         query_log                                = /data/sphinx/var/log/query.log
  68.         read_timeout                           = 5
  69.         max_children                           = 30
  70.         pid_file                                    = /data/sphinx/var/log/searchd.pid
  71.         max_matches                          = 10000
  72.         seamless_rotate                       = 1
  73.         preopen_indexes                      = 0
  74.         unlink_old                                = 1
  75. }
复制代码
sphinx最主要的就是这个配置文件,当然在增量索引部分可以写一个脚本放到crontab里面来定时跑


下面介绍下sphinx的PHP调用部分,sphinx的接口采用PHP的扩展,可以通过pecl或者http://pecl.php.net/package/sphinx来安装
  1. <?php
  2. /**
  3. * LinuxTone全文搜索服务
  4. */
  5. define('IN_DISCUZ', TRUE);
  6. require_once './include/common.inc.php';

  7. $q = isset($_GET['q']) && !empty($_GET['q']) ? $_GET['q'] : '';
  8. $q = str_replace(array('<','>',' ','\'',','),array('','',' ','',''),strip_tags($q));

  9. $page = isset($_GET['page']) && intval($_GET['page'])>0 ? intval($_GET['page']) : 1;
  10. $perNum = 20;
  11. $offset = ($page - 1) * $perNum;

  12. $search = new SphinxClient();
  13. $search->setServer('127.0.0.1',9312);
  14. $search->setConnectTimeout(2);
  15. $search->setArrayResult(true);
  16. $search->setMatchMode(SPH_MATCH_ANY);
  17. $search->setRankingMode(SPH_RANK_PROXIMITY_BM25);
  18. $search->setSortMode(SPH_SORT_EXTENDED,'@relevance desc,@weight desc');
  19. $search->setLimits($offset,$perNum);
  20. $search->setFieldWeights(array('subject'=>2000,'message'=>0));

  21. $rs = array();
  22. $query_totals = $query_time = 0;
  23. if(!empty($q)){
  24.         $rs = $search->Query($q,"*");
  25.         $pages = ceil($rs['total']/$perNum);

  26.         $query_totals = $rs['total_found'];
  27.         $query_time = $rs['time'];
  28. }

  29. $data = $title = $content = array();

  30. if(!empty($rs) && $page <= $pages){
  31.           $pids = array();
  32.           foreach($rs['matches'] as $v){
  33.                   $pids[] = $v['id'];
  34.         }
  35.         $pid = implode(',',$pids);
  36.         $sql = "select pid,tid,author,authorid,subject,message,dateline from cdb_posts where pid IN($pid) and status ='0' and invisible='0'";

  37.         $query = $db->query($sql);
  38.         while($row = $db->fetch_array($query)){
  39.                   $data[] = $row;
  40.                   $title[] = $row['subject'];
  41.                   $content[] = preg_replace('/\[[\/]?(b|img|url|color|s|hr|p|list|i|align|email|u|font|code|hide|table|tr|td|th|attach|list|indent|float).*\]/','',strip_tags($row['message']));
  42.         }
  43.         //搜索词高亮
  44.         $opts = array();
  45.         $opts['before_match'] = '<em>';
  46.         $opts['after_match'] = '</em>';
  47.         $title = $search->BuildExcerpts($title,'lt_posts',$q,$opts);
  48.         $content = $search->BuildExcerpts($content,'lt_posts',$q,$opts);

  49.         foreach($data as $k=>$v){
  50.                   $data[$k]['subject'] = $title[$k];
  51.                   $data[$k]['message'] = $content[$k];
  52.         }

  53.         $url = "s.php?q=".urlencode($q);
  54.         $multipage = multi($rs['total'], $perNum, $page, $url);
  55. }

  56. include template("lt_search");
  57. ?>
复制代码
LinuxTone - IT运维专家论坛_专业的开源架构中文论坛! 自由 平等!互助 友爱! Linux-.png


LinuxTone - IT运维专家论坛_专业的开源架构中文论坛! 自由 平等!互助 友爱! Linux-.png

已有 1 人评分积分 收起 理由
gyl4802959 + 12 精品文章

总评分: 积分 + 12   查看全部评分

&amp;lt;-sina_sign,1703616862,29fb6047,1-&amp;gt;

Rank: 2

注册时间
2010-3-18
最后登录
2010-11-17
在线时间
13 小时
阅读权限
20
积分
85
帖子
47
主题
6
精华
0
UID
8382
发表于 2010-10-24 12:07:36 |显示全部楼层
这算不算是开源?呵呵 越来越喜欢linuxtone了

使用道具 举报

LT管理团队

想飞的鸟

Rank: 9Rank: 9Rank: 9

注册时间
2008-6-20
最后登录
2015-7-7
在线时间
594 小时
阅读权限
200
积分
23002
帖子
512
主题
83
精华
3
UID
95
发表于 2010-10-24 13:28:54 |显示全部楼层
跑主索引的shell脚本search-index.sh
  1. #!/bin/bash
  2. #
  3. # The BBS search exec full index
  4. #
  5. /usr/local/csft-3.2.13/bin/indexer -c /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate lt_posts >> /data/sphinx/var/`date "+%Y-%m-%d-%H"`.log
复制代码


跑增量索引的shell脚本search-delta.sh
  1. #!/bin/bash
  2. #
  3. # The BBS search exec delta index
  4. #
  5. #跑增量索引
  6. /usr/local/csft-3.2.13/bin/indexer -c /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate delta
  7. #合并主索引和增量索引
  8. #/usr/local/csft-3.2.13/bin/indexer --config /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate --merge lt_posts delta
复制代码


只需要根据自己的规则将他们放到crontab来跑,基本上就可以做到近实时搜索的功能
&amp;lt;-sina_sign,1703616862,29fb6047,1-&amp;gt;

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-2-26
最后登录
2017-5-2
在线时间
600 小时
阅读权限
90
积分
82550
帖子
789
主题
41
精华
0
UID
8062
发表于 2010-10-24 16:43:56 |显示全部楼层
学习了!

使用道具 举报

LT技术团队

提供网站渗透测试,代码审计服务。

Rank: 7Rank: 7Rank: 7

注册时间
2008-12-27
最后登录
2017-2-20
在线时间
63 小时
阅读权限
100
积分
2775
帖子
118
主题
23
精华
0
UID
789

LT粉丝

发表于 2010-10-31 02:20:25 |显示全部楼层
哈哈,越来越强大啦
提供网站渗透测试,代码审计服务。

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-11-26
最后登录
2017-9-11
在线时间
627 小时
阅读权限
100
积分
93417
帖子
450
主题
18
精华
1
UID
618
发表于 2011-2-18 10:36:06 |显示全部楼层
强大呀,,学习了

使用道具 举报

Rank: 4

注册时间
2011-1-17
最后登录
2016-9-2
在线时间
46 小时
阅读权限
50
积分
1932
帖子
20
主题
1
精华
0
UID
11786
发表于 2011-3-16 11:36:30 |显示全部楼层
   学习了 强大啊 见识了

使用道具 举报

Rank: 3Rank: 3

注册时间
2011-3-7
最后登录
2012-3-13
在线时间
28 小时
阅读权限
30
积分
384
帖子
71
主题
3
精华
0
UID
12283
发表于 2011-3-16 21:30:15 |显示全部楼层
太好了,又知道了一个有用的开源软件

使用道具 举报

Rank: 7Rank: 7Rank: 7

注册时间
2008-9-20
最后登录
2018-9-29
在线时间
489 小时
阅读权限
100
积分
38013
帖子
2202
主题
48
精华
0
UID
307

LT元老

发表于 2011-3-17 10:27:14 |显示全部楼层
好东西,学习了!

使用道具 举报

论坛元老

北京萍聚

Rank: 8Rank: 8

注册时间
2011-3-16
最后登录
2017-3-15
在线时间
1254 小时
阅读权限
90
积分
124098
帖子
1464
主题
79
精华
0
UID
12402
发表于 2011-3-17 11:06:45 |显示全部楼层
呵呵 linuxtone好强大!开源!感谢您!:)

使用道具 举报

Rank: 6Rank: 6

注册时间
2011-3-22
最后登录
2019-4-20
在线时间
2328 小时
阅读权限
70
积分
9943
帖子
1009
主题
949
精华
0
UID
12494
发表于 2011-4-4 20:15:25 |显示全部楼层
强大,每天进步一点点

使用道具 举报

Rank: 8Rank: 8

注册时间
2009-4-5
最后登录
2014-5-30
在线时间
67 小时
阅读权限
90
积分
12754
帖子
20
主题
2
精华
0
UID
2327
发表于 2011-4-4 21:09:07 |显示全部楼层
功能非常好。

使用道具 举报

Rank: 8Rank: 8

注册时间
2011-1-5
最后登录
2015-7-2
在线时间
447 小时
阅读权限
90
积分
73982
帖子
300
主题
59
精华
0
UID
11677
发表于 2011-4-4 22:25:24 |显示全部楼层
开源精神,支持!天天关注Linuxtone!天天准时签到!
<-sina_sign,1911740435,a06243e0,1->

使用道具 举报

Rank: 8Rank: 8

注册时间
2010-8-22
最后登录
2014-8-18
在线时间
192 小时
阅读权限
90
积分
22488
帖子
299
主题
1
精华
0
UID
10178
发表于 2011-4-4 22:56:52 |显示全部楼层
sphinx+mysql真的不错~~
世界上最遥远的距离,
就TM是星期一到星期五。

使用道具 举报

Rank: 3Rank: 3

注册时间
2010-9-10
最后登录
2011-10-22
在线时间
29 小时
阅读权限
30
积分
451
帖子
68
主题
2
精华
0
UID
10350
发表于 2011-7-27 18:38:09 |显示全部楼层
sphinx 确实不错

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2019-6-27 07:59 , Processed in 0.033498 second(s), 17 queries , Apc On.

Powered by Discuz! X2 Licensed

© 2001-2011 Comsenz Inc.

回顶部