Главная » Все файлы » Просмотр файлов из архивов » Документы » Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа)

Разработка библиотеки для осуществления адаптивного поиска в базах данных Web-приложений (бакалаврская работа), страница 8

2015-08-20СтудИзба

Описание файла

Документ из архива "Разработка библиотеки для осуществления адаптивного поиска в базах данных 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)

Тема: Разработка библиотеки для осуществления адаптивного поиска .

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее