当前位置:首页 > CMS教程 > Discuz > 列表

discuzX使用sphinx实现全文检索教程

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-04 10:21:00 浏览: 评论:0 

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索,这儿为大家介绍两点,第一个是基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置,代码如下:

  1. # LinuxTone full index search configure file 
  2. source lt_posts 
  3.     type = mysql 
  4.     sql_host = 127.0.0.1 
  5.     sql_user = root 
  6.     sql_pass = 
  7.     sql_db = lt_bbs 
  8.     sql_port = 3306 
  9.     sql_query_pre = SET NAMES utf8 
  10.     sql_query = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1 #此处是基于posts表来做索引的,这样的目的是可以同时检索到subject,message,author 三个字段的值 
  11.     sql_attr_uint = fid 
  12.     sql_attr_timestamp = dateline 
  13.     sql_query_info = SELECT * FROM cdb_posts WHERE pid=$id 
  14. index lt_posts 
  15.     source = lt_posts 
  16.     path = /data/sphinx/data/lt_posts 
  17.     docinfo = extern 
  18.     mlock = 0 
  19.     morphology = none 
  20.     min_word_len = 2 
  21.     html_strip = 1 
  22.     charset_dictpath = /usr/local/mmseg-3.2.13/etc/ 
  23.     charset_type = zh_cn.utf-8 
  24.     ngram_len = 0 
  25. ########## 增量索引 ################## 
  26. source delta 
  27.     type = mysql 
  28.     sql_host = 127.0.0.1 
  29.     sql_user = root 
  30.     sql_pass = 
  31.     sql_db = lt_bbs 
  32.     sql_port = 3306 # optional, default is 3306 
  33.     sql_query_pre = SET NAMES utf8 
  34.     sql_query = SELECT pid,tid,fid,dateline,subject,message,author FROM cdb_posts where first=1 and dateline > unix_timestamp()-3600*10 #增量索引采用当前时间戳减去一个需要间隔的时间来新建新增的数据索引 
  35.     sql_attr_uint = fid 
  36.     sql_attr_timestamp = dateline 
  37.     sql_query_info = SELECT * FROM cdb_posts WHERE pid=$id 
  38. index delta 
  39.     source = delta 
  40.     path = /data/sphinx/data/lt_delta 
  41.     docinfo = extern 
  42.     mlock = 0 
  43.     morphology = none 
  44.     min_word_len = 2 
  45.     html_strip = 1 
  46.     charset_dictpath = /usr/local/mmseg-3.2.13/etc/ 
  47.     charset_type = zh_cn.utf-8 //开源软件:phpfensi.com 
  48.     ngram_len = 0 
  49. indexer 
  50.     mem_limit = 32M 
  51. searchd 
  52.     port = 9312 
  53.     log = /data/sphinx/var/log/searchd.log 
  54.     query_log = /data/sphinx/var/log/query.log 
  55.     read_timeout = 5 
  56.     max_children = 30 
  57.     pid_file = /data/sphinx/var/log/searchd.pid 
  58.     max_matches = 10000 
  59.     seamless_rotate = 1 
  60.     preopen_indexes = 0 
  61.     unlink_old = 1 

sphinx最主要的就是这个配置文件,当然在增量索引部分可以写一个脚本放到crontab里面来定时跑.

下面介绍下sphinx的PHP调用部分,sphinx的接口采用PHP的扩展,可以通过pecl或者http://pecl.php.net/package/sphinx来安装,代码如下:

  1. <?php 
  2. /** 
  3.  *全文搜索服务 
  4.  */ 
  5. define('IN_DISCUZ', true); 
  6. require_once './include/common.inc.php'
  7. $q = isset($_GET['q']) && !emptyempty($_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 (!emptyempty($q)) { 
  24.  $rs = $search -> Query($q"*"); 
  25.  $pages = ceil($rs['total'] / $perNum); 
  26.  $query_totals = $rs['total_found']; 
  27.  $query_time = $rs['time']; 
  28. $data = $title = $content = array(); 
  29. if (!emptyempty($rs) && $page <= $pages) { 
  30.  $pids = array(); 
  31.  foreach($rs['matches'as $v) { 
  32.   $pids[] = $v['id']; 
  33.  }  
  34.  $pid = implode(','$pids); 
  35.  $sql = "select pid,tid,author,authorid,subject,message,dateline from cdb_posts where pid IN($pid) and status ='0' and invisible='0'"
  36.  $query = $db -> query($sql); 
  37.  while ($row = $db -> fetch_array($query)) { 
  38.   $data[] = $row
  39.   $title[] = $row['subject']; 
  40.   $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'])); 
  41.  }  
  42.  // 搜索词高亮 
  43.  $opts = array(); 
  44.  $opts['before_match'] = '<em>'
  45.  $opts['after_match'] = '</em>'
  46.  $title = $search -> BuildExcerpts($title'lt_posts'$q$opts); 
  47.  $content = $search -> BuildExcerpts($content'lt_posts'$q$opts); 
  48.  foreach($data as $k => $v) { 
  49.   $data[$k]['subject'] = $title[$k]; 
  50.   $data[$k]['message'] = $content[$k]; 
  51.  } 
  52.  $url = "s.php?q=" . urlencode($q); 
  53.  $multipage = multi($rs['total'], $perNum$page$url); 
  54. include template("lt_search"); 
  55. ?> 

跑主索引的shell脚本search-index.sh,代码如下:

  1. #!/bin/bash 
  2. # The BBS search exec full index 
  3. /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. # The BBS search exec delta index 
  3. #跑增量索引 
  4. /usr/local/csft-3.2.13/bin/indexer -c /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate delta 
  5. #合并主索引和增量索引 
  6. #/usr/local/csft-3.2.13/bin/indexer --config /usr/local/csft-3.2.13/etc/lt_posts.conf --rotate --merge lt_posts delta

Tags: discuzX全文检索 discuzX搜索

分享到: