
- •Национальный исследовательский
- •Аннотация
- •The annotation
- •Введение
- •1. Анализ предметной области
- •1.1. Основные понятия информационного поиска
- •1.2. Задачи информационного поиска
- •1.3. Методы информационного поиска
- •1.4. Адаптивный поиск информации
- •1.5. Проблемы адаптивного поиска
- •Выводы по главе 1
- •2. Алгоритм адаптивного поиска информации
- •Выводы по главе 2
- •3. Разработка программной библиотеки
- •3.1. Проектирование
- •3.2. Системные требования
- •3.3. Настройка параметров адаптивного поиска
- •3.4. Тестирование
- •Выводы по главе 3
- •Заключение
- •Приложения Приложение 1. Исходный код библиотеки
- •Приложение 2. Значения кодов состояний
- •Национальный исследовательский университет «мэи»
- •Задание н а в ы п у с к н у ю р а б о т у
- •Содержание разделов задания и исходные данные
- •Перечень графического материала
- •Рекомендуемая литература
- •Библиографический список
- •Содержани
Выводы по главе 2
Разработан метод хранения предпочтений пользователей, полученных на основании предыдущих поисковых запросов. Описан алгоритм адаптивного поиска в базах данных. Данный алгоритм может быть использован для разработки на его основе библиотеки для осуществления адаптивного поиска в базах данных Web-приложений.
3. Разработка программной библиотеки
3.1. Проектирование
На базе описанного в предыдущей главе алгоритма была спроектирована и реализована на языке PHP программная библиотека для осуществления адаптивного поиска в базах данных Web-приложений. Данная библиотека позволяет осуществлять поиск текстовой информации в большинстве популярных баз данных, а именно: mSQL, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, SQLite и InterBase.
При проектировании библиотеки был выбран объектно-ориентированный подход. Ключевыми объектами, выделенными в процессе проектирования, являются объект соединения с базой данных, объект результата и объект ошибки выполнения поискового запроса. UML-диаграмма основных классов, используемых в библиотеке, представлена на рисунке 3.1.
Класс DB является основным классом библиотеки. Ключевым понятием данного класса является DSN (data source name) – имя источника данных, представляющее собой строку или массив. DSN, заданный в виде строки, имеет следующий вид: phptype://username:password@protocol+hostspec/database?options.
Рассмотрим основные части DSN:
phptype – тип используемого драйвера базы данных (mssql, mysql и т. п.);
username – имя пользователя базы данных;
password – пароль пользователя;
protocol – коммуникационный протокол (tcp, unix и т. п.);
hostspec – спецификация хоста (имя хоста и номер порта);
database – имя базы данных для подключения;
options – дополнительные параметры, разделённые символом “&”.
Рис. 3.1. Диаграмма основных классов библиотеки.
Большинство частей DSN являются не обязательными и могут быть опущены, если база данных, которой осуществляется попытка подключения, это позволяет. Так, например, источник данных может быть описан строкой, представленной в одной из следующих форматов:
phptype://username:password@hostspec/database_name
phptype://username:password@hostspec
phptype://username@hostspec
phptype://hostspec/database
phptype://hostspec
phptype
Кроме того, DSN может быть задан с помощью ассоциативного массива, ключи которого носят те же имена, что и части строки DSN, описанные выше: phptype, username, password, protocol, hostspec, database. Номер порта указывается отдельно от имени хоста через элемент с ключом port. Дополнительные параметры подключения в этом случае должны быть указаны в параметре database и отделены от имени базы данных символом “?”. Для конвертирования DSN из массива в строку и обратно предусмотрены методы getDSNString() и parseDSN(). Данные методы класса позволяют разработчику указывать DSN в любом из двух возможных типов.
Основные методы класса, factory() и connect(), позволяют взаимодействовать с требуемым источником данных по его DSN. Метод connect(), в отличие от factory(), сразу же устанавливает соединение, не дожидаясь первого запроса к базе данных. Оба метода возвращают объект одного из наследников класса DB_common: DB_mssql, DB_mysql, DB_mysqli, DB_pgsql, DB_ibase или DB_oci8. Подобный подход позволяет легко расширять библиотеку.
Классы DB_result и DB_row формируют единый интерфейс для работы с результатами поисковой выдачи, не зависящий от типа используемого драйвера базы данных. Методы класса позволяют работать с результатом как с ассоциативным или нумерованным массивом. Кроме того, методы nextResult() и fetchRow() позволяют обрабатывать полученный результат строка за строкой и не хранить весь массив данных.
Поисковые методы объектов класса DB_common используют расширенный класс phpMorphy одноимённой библиотеки морфологического анализа, распространяемой бесплатно для некоммерческого использования. Методы phpMorphy позволяют решать следующие задачи: лемматизация (получение нормальной формы слова), получение всех форм слова, получение грамматической информации для слова (часть речи, падеж, спряжение и т. д.), изменение формы слова в соответствии с заданными грамматическими характеристиками, изменение формы слова по заданному образцу. Поддерживаемые в phpMorphy языки: русский, английский, немецкий, украинский, эстонский. Есть возможность добавить поддержку других языков. phpMorphy поддерживает все однобайтовые кодировки (windows-1251, iso-8859 и т. п.) и Unicode кодировки (utf-8, utf-16le/be, utf-32, ucs2, ucs4). По умолчанию библиотека работает с кодировкой UTF-8. phpMorphy использует для работы словарь. Поддерживаются словари AOT и myspell, свободно распространяемые, в том числе и для коммерческого использования. Словари представлены в двух видах: в исходном и бинарном. Исходный словарь представлен в виде XML файла и содержит основы слов, правила изменения и грамматическую информацию.
Для работы библиотеки требуется скомпилировать бинарный словарь. При компиляции используется словарь в исходном виде. Бинарный словарь обладает следующими особенностями: совместим c различными платформами,все данные представлены в заданной кодировке, в верхнем (по умолчанию) или нижнем регистре.Последняя особенность позволяет не тратить время на преобразование кодировки и регистра в реальном времени, а сделать это один раз на этапе компиляции.
Физически словарь представлен в виде нескольких файлов:
common_aut.ru – хранилище всех словоформ;
morph_data.bin – хранилище грамматической информации;
predict_aut.bin – хранилище окончаний для предсказания.
Именование файлов словаря производится в соответствии с шаблоном <имя_файла>.<язык>.bin, где <язык> – условный код языка, в виде ISO3166 кода страны и ISO639 кода языка, то есть ru_ru, en_en и т. п. Данный метод позволяет размещать в одном каталоге словари для нескольких языков.
Весь процесс поиска при работе с библиотекой состоит из трёх простых действий: подключения файла библиотеки, установки соединения с базой данных, например, с помощью метода DB::connect() и вызова метода поиска DB_Common::search() с указанием необходимых параметров. Пример работы с библиотекой приведён в листинге 3.1.
require_once 'DB.php';
// Источник данных
$dsn = 'mssql://login:pass@localhost/db_name';
// Установка соединения с базой данных
$db =& DB::connect($dsn);
// Поиск
$params = array('from' => 'table', 'where' => 'field');
$results = $db->search('Поисковый запрос', $params);
// Вывод результатов
while($r = $results->fetchRow())
echo $r['field'];
Листинг 3.1. Пример использования библиотеки.
Класс DB_error – вспомогательный класс для обработки возможных ошибок, возникающих в процессе работы с библиотекой. Объекты данного класса могут быть легко преобразованы в текстовые сообщения о возникшей ошибке, что существенно облегчает процесс отладки приложений, создаваемых на основе данной библиотеки. Пример обработки ошибок, возникающих при установке соединения с базой данных, приведён в листинге 3.2. Обработка ошибок, возникающих во время поиска, осуществляется аналогично.
require_once 'DB.php';
// Источник данных
$dsn = 'mssql://login:pass@localhost/db_name';
// Установка соединения с базой данных
$db =& DB::connect($dsn);
// Обработка ошибок
if (DB::isError($db))
echo $db->getMessage();
Листинг 3.2. Пример обработки ошибок.
Кодирование скриптов библиотеки осуществлялось на языке программирования PHP, интенсивно применяемом при разработке Web-приложений, в среде NetBeans.