www.gusucode.com > Carbon Forum PHP轻论坛系统 v3.6.5源码程序 > Carbon-Forum-3.6.5/includes/SearchClient.class.php
<?php class SearchClient { private static $singleSelf; /** * sphinx api对象 * @var sphinx object * */ private static $sphinx; private function __construct() { if( !defined( 'SearchServer' ) || !defined( 'SearchPort' ) ) { throw new Exception("Search server or search port must be set!"); } self::$sphinx = new SphinxClient(); self::$sphinx->setServer( SearchServer, SearchPort ); self::$sphinx->SetConnectTimeout ( 1 ); } private static function getSingle() { self::$singleSelf OR self::$singleSelf = new self(); return self::$singleSelf; } public static function searchLike( $pKeywords, $index='*', $pStart = 0, $pSize=12, $filter = '', $sort = '', $columns=array("ID") ) { self::getSingle(); $sp = self::$sphinx; empty( $sort ) || $sp->SetSortMode ( SPH_SORT_EXTENDED, $sort ); if ($filter) { $filter['select'] && $sp->SetSelect( '*,'.$filter['select'] ); foreach( $filter['filter'] as $key => &$row) { $sp->SetFilter ( $key, $row['val'], isset($row['rev']) ? $row['rev']: false ); } } $sp->SetLimits ( $pStart, $pSize, 10000 ); $sp->SetArrayResult ( true ); $res = $sp->query( $pKeywords, $index ); $sp->ResetFilters(); $sp->ResetGroupBy(); if ( $res === false ) { throw new Exception( $sp->getLastError() ); } else { $searchList = array(); foreach ( $res["matches"] as &$row) { $searchList['id'][] = $row['id']; foreach( $columns as $col ) { $col = strtolower($col); if( isset( $row['attrs'][$col] ) ) { $searchList[$col][] = $row['attrs'][$col]; } } } return array( $searchList, $res['total'] ); } } public static function searchCount( $pKeywords, $index='*', $pStart = 0, $pSize=12, $filter = '', $sort = '' ) { $tRes = self::searchLike( $pKeywords, $index, $pStart, $pSize, $filter, $sort ); return empty( $tRes ) ? 0 : $tRes[1]; } public static function callProxy( $spMethod, $args) { self::getSingle(); $sp = self::$sphinx; return call_user_func_array(array($sp, $spMethod), $args); } }