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; }