Advertisement
mr_therabbit

Untitled

Dec 1st, 2014
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.37 KB | None | 0 0
  1. <?
  2. /**
  3.  * SphinxContent
  4.  * Класс для работы с индексом Sphinx.
  5.  *
  6.  * @package
  7.  * @author TheRabbit
  8.  * @copyright 2013
  9.  * @version $Id$
  10.  * @access public
  11.  */
  12. class SphinxContent {
  13.    
  14.  
  15.    
  16.     /**
  17.      * SphinxContent::set_tags()
  18.      * Обновляет в таблицах индекса теги.
  19.      *
  20.      * @param integer $intID ID тега
  21.      * @param string $strTitle название тега
  22.      * @param string $strType тип тега (tag|star)
  23.      * @return void
  24.      */
  25.     public static function set_tags($intID, $strTitle, $strType = 'tag', $strCategory = '') {
  26.         $strTable = false;
  27.         if ($strType == 'tag') $strTable = 'tag';
  28.         elseif ($strType == 'star') $strTable = 'star';
  29.        
  30.         if ($strTable !== false) {
  31.             $objSphinxDB = DB::connection('sphinx');
  32.             $objV = $objSphinxDB->table($strTable)->where('id', '=', $intID)->first();
  33.            
  34.             if (!isset($objV->id)) $objSphinxDB->table($strTable)->insert(array('id' => $intID, 'title' => $strTitle, 'category' => $strCategory));
  35.             else $objSphinxDB->table($strTable)->where('id', '=', $intID)->update(array('title' => $strTitle, 'category' => $strCategory));
  36.         }//\\ if
  37.     }//\\ set_tags
  38.  
  39.     /**
  40.      * SphinxContent::set_video()
  41.      * Добавляет в индекс видео.
  42.      *
  43.      * @param integer $intID ID видео
  44.      * @return void
  45.      */
  46.     public static function set_video($intID) {
  47.         $arrVideo = Video::get($intID);
  48.         if ($arrVideo['id']) {
  49.             // Обновим инфу о ролике для sphinx
  50.             $objSphinxDB = DB::connection('sphinx');
  51.             $objV = $objSphinxDB->table('video')->where('id', '=', intval($arrVideo['id']))->first();
  52.             $arrV = array(
  53.                 'title' => '',
  54.                 'description' => '',
  55.                 'tags' => '',
  56.                 'stars' => '',
  57.                 'timeadd' => 0,
  58.                 'duration' => 0,
  59.                 'category' => '',
  60.             );
  61.             if (isset($arrVideo['title'])) $arrV['title'] = $arrVideo['title'];
  62.             if (isset($arrVideo['desc'])) $arrV['description'] = $arrVideo['desc'];
  63.             if (isset($arrVideo['category'])) $arrV['category'] = $arrVideo['category'];
  64.             if (isset($arrVideo['timeadd'])) $arrV['timeadd'] = $arrVideo['timeadd'];
  65.             if (isset($arrVideo['duration'])) $arrV['duration'] = $arrVideo['duration'];
  66.             if (isset($arrVideo['tags']) && $arrVideo['tags'] !== false && count($arrVideo['tags'])) {
  67.                 $arrT = array();
  68.                 foreach ($arrVideo['tags'] as $arrTag)
  69.                     if (strlen(trim($arrTag['title'])))
  70.                         $arrT[] = $arrTag['title'];
  71.                 if (count($arrT))
  72.                     $arrV['tags'] = implode(', ', $arrT);
  73.             }//\\ if
  74.             if (isset($arrVideo['stars']) && $arrVideo['stars'] !== false && count($arrVideo['stars'])) {
  75.                 $arrT = array();
  76.                 foreach ($arrVideo['stars'] as $arrTag)
  77.                     if (strlen(trim($arrTag['title'])))
  78.                         $arrT[] = $arrTag['title'];
  79.                 if (count($arrT))
  80.                     $arrV['stars'] = implode(', ', $arrT);
  81.             }//\\ if
  82.            
  83.             if (!isset($objV->id)) $objSphinxDB->table('video')->insert(array('id' => $arrVideo['id'], 'title' => $arrV['title'], 'description' => $arrV['description'], 'tags' => $arrV['tags'], 'category' => $arrV['category'], 'stars' => $arrV['stars'], 'timeadd' => $arrV['timeadd'], 'duration' => $arrV['duration']));
  84.             else $objSphinxDB->table('video')->where('id', '=', intval($arrVideo['id']))->update(array('title' => $arrV['title'], 'description' => $arrV['description'], 'tags' => $arrV['tags'], 'category' => $arrV['category'], 'stars' => $arrV['stars'], 'timeadd' => $arrV['timeadd'], 'duration' => $arrV['duration']));
  85.         }//\\ if
  86.     }//\\ set_video
  87.    
  88.     /**
  89.      * SphinxContent::remove_video()
  90.      * Удаляет из индекса видео.
  91.      *
  92.      * @param integer $intID ID видео
  93.      * @return void
  94.      */
  95.     public static function remove_video($intID) {
  96.         DB::connection('sphinx')->table('video')->where('id', '=', $intID)->delete();
  97.     }//\\ remove_video
  98.    
  99.    
  100.     /**
  101.      * SphinxContent::search()
  102.      * Осуществляет поиск.
  103.      *
  104.      * @param string $strSearch поисковая фраза
  105.      * @param string|array $strIndex по каким индексам будем искать all|video|tag|star
  106.      * @return void
  107.      */
  108.     public static function search($strSearch, $strIndex = 'all', $intNumPage = 1, $intNumOnPage = 50) {
  109.         $arrAllIndex = array(
  110.             'all' => '*',
  111.             'video' => 'index_video',
  112.             'tag' => 'index_tag',
  113.             'star' => 'index_star',
  114.         );
  115.         $arrNumIndex = array(
  116.             1 => 'video',
  117.             2 => 'tag',
  118.             3 => 'star',
  119.         );
  120.        
  121.         // Определимся
  122.         $strQueryIndex = '*';
  123.         if (is_string($strIndex)) $strQueryIndex = $arrAllIndex[$strIndex];
  124.         elseif (is_array($strIndex) && count($strIndex)) {
  125.             $arrT = array();
  126.             foreach ($strIndex as $strT)
  127.                 if (isset($arrAllIndex[$strT]))
  128.                     $arrT[] = $arrAllIndex[$strT];
  129.             $strQueryIndex = implode(';', $arrT);
  130.         }//\\ if
  131.        
  132.         $arrResultID = array('result' => false);
  133.        
  134.         $strSearch = trim($strSearch);
  135.         if (strlen($strSearch) > 3) {
  136.             $objSphinx = new SphinxClient();
  137.             $objSphinx->SetServer(Config::get('sphinx.host'), Config::get('sphinx.port'));
  138.            
  139.             // Совпадение по любому слову
  140.             $objSphinx->SetMatchMode(SPH_MATCH_ANY);
  141.            
  142.             // Возвращает определенную страницу
  143.             $objSphinx->SetLimits(($intNumPage - 1)*$intNumOnPage, $intNumOnPage);
  144.            
  145.             // Результаты сортировать по релевантности
  146.             $objSphinx->SetSortMode(SPH_SORT_RELEVANCE);
  147.  
  148.             // Делаем запрос
  149.             $arrResult = $objSphinx->Query($strSearch, $strQueryIndex);
  150.            
  151.            
  152.             // обработка результатов запроса
  153.             if ($arrResult === false) {
  154.                 Log::error('Sphinx ERROR Query failed: '.$objSphinx->GetLastError()); // выводим ошибку если произошла
  155.             } else {
  156.                 if ( $objSphinx->GetLastWarning() ) Log::error('Sphinx WARNING: '.$objSphinx->GetLastWarning());
  157.                
  158.                 $arrResultID['num_total'] = intval($arrResult['total_found']);
  159.                 $arrResultID['current_page'] = $intNumPage;
  160.                 $arrResultID['count_page'] = ceil(intval($arrResult['total_found']) / $intNumOnPage);
  161.            
  162.                 if (!empty($arrResult['matches']) ) { // если есть результаты поиска - обрабатываем их
  163.                     foreach ($arrResult['matches'] as $intID => $arrInfo ) {
  164.                         $arrResultID['result'][$arrNumIndex[$intID % 10]][] = (($intID - ($intID % 10)) / 10);
  165.                     }//\\ foreach
  166.                 }//\\ if
  167.             }//\\ if
  168.         }//\\ if
  169.        
  170.         return $arrResultID;       
  171.     }//\\ search
  172. }//\\ SphinxContent
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement