Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа), страница 8
Описание файла
Документ из архива "Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа)", который расположен в категории "". Всё это находится в предмете "дипломы и вкр" из 8 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "выпускные работы и поступление в магистратуру" в общих файлах.
Онлайн просмотр документа "Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа)"
Текст 8 страницы из документа "Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа)"
unset($words[$i]);
}
}
public function indexWords($words)
{
$result = $this->prepareWords($words);
if(DB::isError($result))
return $result;
if(count($words))
{
// Увеличиваем значения счётчиков слов
$result = $this->_inc_words($words);
if(DB::isError($result))
return $result;
// Получаем уже проиндексированные слова
$used_words = $this->affectedRows() ? $this->_get_words($words) : array();
if(DB::isError($used_words))
return $used_words;
// Добавляем непроиндексированные слова
$result = $this->_add_words(array_diff($words, $used_words));
if(DB::isError($result))
return $result;
}
}
public function incWords($words)
{
$result = $this->prepareWords($words);
if(DB::isError($result))
return $result;
return $this->_inc_words($words);
}
private function _inc_words($words)
{
if(is_array($words) && count($words))
{
$in = implode(',', array_fill(0, count($words), '?'));
$sql = "UPDATE `!` SET `count` = `count` + 1 WHERE `user_id` = ?
AND `word` IN ({$in})";
$data = array_merge(array($this->options['users_words_table_name'],
$this->options['user_id']), $words);
return $this->query($sql, $data);
}
}
public function getWords($words = NULL)
{
if(isset($words))
{
$result = $this->prepareWords($words);
if(DB::isError($result))
return $result;
}
return $this->_get_words($words);
}
private function _get_words($words = NULL)
{
if(is_array($words))
{
if(!count($words))
return $words;
$in = implode(',', array_fill(0, count($words), '?'));
$sql = "SELECT `word` FROM `!` WHERE `user_id` = ? AND `word` IN ({$in})
ORDER BY `count` DESC";
$data = array_merge(array($this->options['users_words_table_name'],
$this->options['user_id']), $words);
}
else
{
$sql = "SELECT `word` FROM `!` WHERE `user_id` = ? ORDER BY `count` DESC";
$data = array($this->options['users_words_table_name'],
$this->options['user_id']);
}
return $this->getCol($sql, 0, $data);
}
public function countWords()
{
$sql = "SELECT COUNT(*) FROM `!` WHERE `user_id` = ?";
$data = array($this->options['users_words_table_name'],
$this->options['user_id']);
return $this->getOne($sql, $data);
}
public function sliceWords($limit)
{
$sql = "DELETE FROM `!` WHERE `user_id` = ? ORDER BY `count`, `date` LIMIT ?";
$data = array($this->options['users_words_table_name'], $this->options['user_id'], $limit);
$result = $this->query($sql, $data);
}
public function addWords($words)
{
$result = $this->prepareWords($words);
if(DB::isError($result))
return $result;
return $this->_add_words($words);
}
private function _add_words($words)
{
if(is_array($words) && count($words))
{
// Удаляем лишние слова
if(is_int($this->options['words_limit']) && $this->options['words_limit']>0)
{
$words = array_slice($words, 0, $this->options['words_limit']);
$count = $this->countWords();
if(DB::isError($count))
return $count;
if($count > $this->options['words_limit'])
{
$result =
$this->sliceWords($count - $this->options['words_limit']);
if(DB::isError($result))
return $result;
$count = $this->options['words_limit'];
}
if($this->options['words_limit'] - $count < count($words))
{
$result = $this->query("DELETE FROM `!` WHERE `user_id` = ?
ORDER BY `count` LIMIT ?",
array($this->options['users_words_table_name'],
$this->options['user_id'],
count($words) - $this->options['words_limit'] + $count));
if(DB::isError($result))
die($result->getMessage());
$count -= $this->affectedRows();
}
$words=array_slice($words, 0, $this->options['words_limit'] - $count);
}
if(count($words))
{
$values = "'" . $this->options['user_id'] . "', " . implode("), ('" .
$this->options['user_id'] . "', ", array_fill(0, count($words), '?'));
$sql = "INSERT INTO `!` (`user_id`, `word`) VALUES ({$values})";
$data = array_merge(array($this->options['users_words_table_name']),
$words);
$result = $this->query($sql, $data);
if(DB::isError($result))
die($result->getMessage());
}
}
return DB_OK;
}
public function search($query, $params)
{
$fields = '*';
$limit = '';
$method = 'query';
// Формирование списка выбираемых полей
if(isset($params['search']))
{
if(is_string($params['search']))
$fields = '`' . $params['search'] . '`';
elseif(is_array($params['search']))
{
$fields = array();
foreach($params['search'] as $as => $field)
{
if(!is_string($field))
return $this->raiseError("Недопустимое значение параметра 'search'");
$fields[] = (is_numeric($as)) ? "`$field`" : " `$field` AS `$as`";
}
if(!count($fields))
return $this->raiseError("Недопустимое значение параметра 'search'");
$fields = implode(', ', $fields);
}
else
return $this->raiseError("Недопустимое значение параметра 'search'");
}
// Определение источника данных
if(isset($params['from'], $params['where']))
{
if(is_string($params['from']))
$source = '`' . $params['from'] . '`';
else
return $this->raiseError("Недопустимое значение параметра 'from'");
if(is_string($params['where']))
$where = '`' . $params['where'] . '`';
else
return $this->raiseError("Недопустимое значение параметра 'where'");
}
else
return $this->raiseError("Источник данных для поиска (параметры 'from' и
'where') не определён");
// Ограничение числа выводимых записей
if(isset($params['limit']) && is_numeric($params['limit']))
{
$limit = $params['limit'];
if(isset($params['offset']) && is_numeric($params['offset']))
$limit = $params['offset'] . ',' . $limit;
$limit = 'LIMIT ' . $limit;
}
static $morphy;
if(!isset($morphy))
{
@include_once 'DB/morphy/common.php';
$dir = $_SERVER['DOCUMENT_ROOT'] . '/tmp/example/DB/dicts';
$lang = 'ru_RU';
$morphy = new phpMorphy($dir, $lang, array(
'storage' => PHPMORPHY_STORAGE_MEM,
'with_gramtab' => false,
'predict_by_suffix' => true,
'predict_by_db' => true,
));
}
$query_forms = $morphy->getAllForms($query);
phpMorphy::simpleWordsArray($query_forms);
$query_all_forms = implode(' ', $query_forms);
// Адаптивный поиск
if(isset($params['adaptive']))
$this->setOption('adaptive', $params['adaptive']);
if($this->options['adaptive'])
{
$words = $morphy->getBaseForm($query);
phpMorphy::simpleWordsArray($words);
$indexed_words = $this->getWords();
$order = array();
foreach($indexed_words as $word)
{
$w = $morphy->getAllForms($word);
phpMorphy::simpleWordsArray($w);
if(count($w))
$order = array_merge($order, $w);
else
$order[] = $word;
}
$order = implode(' ', $order);
$sql = "SELECT {$fields} FROM {$source} WHERE MATCH({$where}) AGAINST(?)
ORDER BY MATCH({$where}) AGAINST(?) DESC {$limit}";
$data = array($query_all_forms, $order);
$this->indexWords($words);
}
// Обычный поиск
else
{
$sql = "SELECT {$fields} FROM {$source} WHERE MATCH({$where}) AGAINST(?)
{$limit}";
$data = array($query_all_forms);
}
if(isset($params['method']))
$method = $params['method'];
if($method == 'getAssoc')
$result = $this->getAssoc($sql, false, $data);
elseif($method == 'getCol')
$result = $this->getCol($sql, 0, $data);
else
$result = $this->query($sql, $data);
if(DB::isError($result))
return $result;
// Подсветка результатов
if(isset($params['highlight']))
$this->setOption('highlight', $params['highlight']);
if($this->options['highlight'])
{
if(isset($params['method']))
switch($params['method'])
{
case 'getAssoc' :
foreach($result as &$r)
$r = self::highlight($r, $query_forms);
break;
}
}
return $result;
}
static public function highlight($text, $words)
{
uasort(&$words, 'strlen_cmp');
$words = array_reverse($words);
$patterns = array();
foreach($words as $v)
$patterns[] = "/($v)/isu";
$text = preg_replace($patterns, '<span class="hl">\\1</span>', $text);
return $text;
}
}
function strlen_cmp($a, $b)
{
static $check;
if(!isset($check))
$check = function_exists('mb_strlen');
if($check)
{
$a = mb_strlen($a);
$b = mb_strlen($b);
}
else
{
$a = strlen($a);
$b = strlen($b);
}
if($a == $b)
return 0;
return ($a < $b) ? -1 : 1;
}
?>
Приложение 2. Значения кодов состояний
Код | Константа | Описание |
0 | DB_OK | Ошибок нет |
1 | DB_ERROR_SYNTAX | Синтаксическая ошибка запроса к базе данных |
2 | DB_ERROR_CONSTRAINT | Отсутствует внешний ключ |
3 | DB_ERROR_NOT_FOUND | Попытка удалить несуществующий индекс |
4 | DB_ERROR_ALREADY_EXISTS | Попытка создания уже существующей таблицы |
5 | DB_ERROR_UNSUPPORTED | Запрошенная операция не поддерживается |
6 | DB_ERROR_MISMATCH | Число параметров запроса не совпадает с требуемым |
7 | DB_ERROR_TRUNCATED | Возвращаемые данные были получены не полностью |
8 | DB_ERROR_INVALID | Ошибка входных данных запроса к базе данных |
9 | DB_ERROR_INVALID_DSN | Неверно указаны данные соединения |
10 | DB_ERROR_INVALID_NUMBER | Попытка записи нечислового значения в числовое поле |
11 | DB_ERROR_INVALID_DATE | Неверный формат даты в запросе к базе данных |
12 | DB_ERROR_DIVZERO | Ошибка деления на ноль при запросе к базе данных |
13 | DB_ERROR_NODBSELECTED | Не указана база данных при попытке соединения |
14 | DB_ERROR_CANNOT_CREATE | Невозможно создать таблицу или файл базы данных |
15 | DB_ERROR_CANNOT_DROP | Невозможно удалить таблицу или файл базы данных |
16 | DB_ERROR_NOSUCHTABLE | Попытка обращения к несуществующей таблице |
17 | DB_ERROR_NOSUCHFIELD | Попытка обращения к несуществующему полю |
18 | DB_ERROR_NOSUCHDB | Попытка доступа к несуществующей базе данных |
19 | DB_ERROR_NEED_MORE_DATA | Необходимо больше данных |
20 | DB_ERROR_CONNECT_FAILED | Невозможно установить соединение с базой данных |
21 | DB_ERROR_ACCESS_VIOLATION | Ошибка доступа к таблице или файлу базы данных |
22 | DB_ERROR_MAX_WORD_LENGTH | Максимальная длина индексируемого слова должна быть целым положительным числом |
23 | DB_ERROR_WORDS_TABLE_CREATE | Не удалось создать таблицу ключевых слов |
24 | DB_ERROR_USERS_KEYS_CREATE | Не удалось создать таблицу идентификационных ключей пользователей |
25 | DB_ERROR_KEY_CREATE | Не удалось создать ключ для пользователя |
26 | DB_ERROR_WORDS | Недопустимый или пустой список слов |
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ
«МЭИ»
Институт Автоматики и вычислительной техники
Кафедра Прикладной математики
ЗАДАНИЕ
Н А В Ы П У С К Н У Ю Р А Б О Т У
бакалавра Прикладной математики и информатики
по направлению «Прикладная математика и информатика» (010500)
Тема: Разработка библиотеки для осуществления адаптивного поиска .