示例#1
0
 public function goSearch($string)
 {
     $materials = new Model_Material('groups');
     //подключаем библиотеки
     require_once DOCROOT . 'application/classes/PHPMorphy/src/common.php';
     $dir = DOCROOT . 'application/classes/PHPMorphy/dicts/';
     $lang = 'ru_RU';
     $opts = array('storage' => PHPMORPHY_STORAGE_FILE);
     try {
         $morphy = new phpMorphy($dir, $lang, $opts);
     } catch (phpMorphy_Exception $e) {
         die('Error occured while creating phpMorphy instance: ' . $e->getMessage());
     }
     $data = array();
     $request = null;
     $errors = null;
     if (!empty($string)) {
         // Очищаем от html-тегов и прочего
         $search = trim(addslashes(strip_tags($string)));
         $request = $search;
     }
     /* Создаем экземпляр phpMorphy */
     if (!empty($search)) {
         // Обрабатываем данные как и в прошлом контроллере
         if (mb_strlen($search, "UTF-8") > 2) {
             preg_match_all('/([a-zа-яё]+)/ui', mb_strtoupper($search, "UTF-8"), $search_words);
             $words = $morphy->lemmatize($search_words[1]);
             $s_words = array();
             $pre_result = array();
             $sorter = array();
             foreach ($words as $k => $w) {
                 if (!$w) {
                     $w[0] = $k;
                 }
                 if (mb_strlen($w[0], "UTF-8") > 2) {
                     $s_words[] = $w[0];
                 }
             }
             if (!count($s_words)) {
                 // Обрабатываем ошибку (нет ни одного слова длиннее 2 символов)
             } else {
                 //перебираем каждое слово
                 foreach ($s_words as $s_word) {
                     //сначала ищем в названиях материалов
                     $search_index = ORM::factory('Materials')->where('name', 'LIKE', '%' . $s_word . '%')->find_all();
                     foreach ($search_index as $si) {
                         //если в другом слове было совпадение
                         if (isset($pre_result[$si->id])) {
                             //добавляем вес
                             $sorter[$si->id] = $sorter[$si->id] + 2;
                             $pre_result[$si->id]['weight'] = $pre_result[$si->id]['weight'] + 2;
                             $pre_result[$si->id]['s_text'] = str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($pre_result[$si->id]['s_text']));
                         } else {
                             $sorter[$si->id] = 2;
                             $material = $materials->getMaterial($si->id);
                             $pre_result[$si->id] = array('weight' => 2, 's_text' => str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($si->name)));
                         }
                     }
                     //ищем в текстах
                     $search_index = ORM::factory('Texts')->where('value', 'LIKE', '%' . $s_word . '%')->find_all();
                     foreach ($search_index as $si) {
                         //получаем mid для материала
                         $mid = $materials->getMidFromFieldId($si->id, 'texts');
                         if (isset($pre_result[$mid])) {
                             $sorter[$mid] = $sorter[$mid] + 1;
                             $pre_result[$mid]['weight'] = $pre_result[$mid]['weight'] + 1;
                             $pre_result[$mid]['s_text'] = str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($pre_result[$mid]['s_text']));
                         } else {
                             $pre_result[$mid] = array('weight' => 2, 's_text' => str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($si->value)));
                             $sorter[$mid] = 1;
                         }
                     }
                     //ищем в текстах
                     $search_index = ORM::factory('Chars')->where('value', 'LIKE', '%' . $s_word . '%')->find_all();
                     foreach ($search_index as $si) {
                         //получаем mid для материала
                         $mid = $materials->getMidFromFieldId($si->id, 'chars');
                         if (isset($pre_result[$mid])) {
                             $sorter[$mid] = $sorter[$mid] + 1;
                             $pre_result[$mid]['weight'] = $pre_result[$mid]['weight'] + 1;
                             $pre_result[$mid]['s_text'] = str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($pre_result[$mid]['s_text']));
                         } else {
                             $pre_result[$mid] = array('weight' => 2, 's_text' => str_ireplace(mb_strtolower($s_word), '<b>' . $s_word . '</b>', strip_tags($si->value)));
                             $sorter[$mid] = 1;
                         }
                     }
                 }
                 arsort($sorter);
                 // Сортируем массив по весу результатов
                 foreach ($sorter as $id => $weight) {
                     // Тут, соответственно, получаем данные о результатах и помещаем в массив
                     $data[] = $id;
                 }
             }
         } else {
             // Обрабатываем ошибку - введен слишком короткий запрос
         }
     } else {
         // Обрабатываем ошибку - пустой поисковый запрос
     }
     return $data;
 }