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; }
<?php // Подключите файл common.php. phpmorphy-0.3.2 - для версии 0.3.2, // если используется иная версия исправьте код. require_once 'c:/server/bin/PHP/lib/phpmorphy-0.3.7/src/common.php'; //global $morphy; // Укажите путь к каталогу со словарями $dir = 'c:/server/bin/PHP/lib/phpmorphy-0.3.7/dicts'; // Укажите, для какого языка будем использовать словарь. // Язык указывается как ISO3166 код страны и ISO639 код языка, // разделенные символом подчеркивания (ru_RU, uk_UA, en_EN, de_DE и т.п.) $lang = 'ru_RU'; // Укажите опции // Список поддерживаемых опций см. ниже $opts = array('storage' => PHPMORPHY_STORAGE_MEM, 'predict_by_suffix' => TRUE); // создаем экземпляр класса phpMorphy // обратите внимание: все функции phpMorphy являются throwable т.е. // могут возбуждать исключения типа phpMorphy_Exception (конструктор тоже) try { $morphy = new phpMorphy($dir, $lang, $opts); print_r($morphy->lemmatize('яблоко', phpMorphy::NORMAL)); //exit(0); } catch (phpMorphy_Exception $e) { die('Error occured while creating phpMorphy instance: ' . $e->getMessage()); } // далее под $morphy мы подразумеваем экземпляр класса phpMorphy
error_reporting(E_ALL | E_STRICT); //ini_set('default_charset','UTF-8'); $path = $_SESSION['path']; require 'stemmer_utf.php'; require 'work_csv.php'; require 'readfile.php'; require_once dirname(__FILE__) . '/phpmorphy/src/common.php'; $opts = array('storage' => PHPMORPHY_STORAGE_FILE, 'with_gramtab' => false, 'predict_by_suffix' => true, 'predict_by_db' => true); $dir = dirname(__FILE__) . '/phpmorphy/dicts'; // Create descriptor for dictionary located in $dir directory with russian language $dict_bundle = new phpMorphy_FilesBundle($dir, 'rus'); try { $morphy = new phpMorphy($dict_bundle, $opts); } catch (phpMorphy_Exception $e) { die('Error occured while creating phpMorphy instance: ' . $e->getMessage()); } //$csv = new CSV($path); // $csv_lines = $csv->getCSV($path); $handle = fopen($path, "r"); //$row = 1; while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $insertValues = array(); foreach ($data as $v) { $insertValues[] = addslashes(trim($v)); $values = implode(',', $insertValues); $word = $morphy->lemmatize($values); //print_r($morphy->getBaseForm($value)); //$z=$morphy->getBaseForm($values); } } fclose($handle);