daily pastebin goal
68%
SHARE
TWEET

Untitled

mr_therabbit Dec 1st, 2014 209 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
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top