SHARE
TWEET

Untitled

mr_therabbit Dec 1st, 2014 202 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
Top