Проект по теме :
Поисковая система
Выполнил
:
Студент группы Р-101
Степаненко И.С.
Общая архитектура
и термины
- Под поисковым сервером (или просто "поисковик") мы понимаем библиотеку или компонент, вообще, программное решение, которое самостоятельно ведёт свою базу данных (на самом деле это может быть и СУБД, и просто файлы и распределённая платформа хранения) документов, в которых, собственно, и происходит поиск, предоставляет сторонним приложениям добавлять, удалять и обновлять документы в этой базе. Этот процесс называется индексированием, и может быть реализовано отдельным компонентом или сервером (индексатором). Другой компонент, именно поисковый механизм, принимает запрос на поиск и обрабатывая созданную индексатором базу производит выборку данных, которые соответствуют запросу. Кроме этого, он может вычислять дополнительные параметры для результатов поиска (ранжировать документы, вычислять степень соответствия поисковому запросу и т.п.). Это самые важные системы поисковика, и они могут быть как монолитно реализованы в одной библиотеке, так и быть самостоятельными серверами, доступ к которым реализуется через различные прикладные протоколы и API. Дополнительно, в поисковом сервере может быть реализована предварительная обработка документов перед индексацией (например, извлечение текста с файлов различных форматов или баз данных), различные API также могут реализоваться дополнительными компонентами. Сам сервер может хранить свои индексные данные в базе данных (как встроенной, так и используя внешний сервер, например, MySQL), в виде файлов собственного оптимизированного формата или даже использовать специальную распределённую файловую систему.
Какие параметры важны?
- скорость индексирования
- скорость переиндексации
- поддерживаемые API
- поддерживаемые протоколы
- размер базы и скорость поиска
- поддерживаемые типы документов
- работа с разными языками и стемминг
- поддержка дополнительных типов полей в документах
- платформа и язык
- наличие встроенных механизмов ранжирования и сортировки
скорость
индексирования
- скорость индексирования - то есть, как быстро поисковый сервер "перемалывает" документы и заносит их в свой индекс, делая доступным поиск по ним. Обычно измеряется в мегабайтах чистого текста в секунду.
скорость
переиндексации
- скорость переиндексации - в процессе работы документы изменяются или добавляются новые, поэтому приходится переиндексировать информацию. Если сервер поддерживает инкрементное индексирование, то мы обрабатываем
только новые документы, а обновление
всего индекса оставляем на потом или
даже вообще не делать. Другие
сервера требуют полной перестройки
индекса при
добавлении новой информации, либо
используют
дополнительные индексы (дельта-индекс),
в который
включается только новая информация
поддерживаемые
API
- поддерживаемые API - если вы используете поисковик в связке с веб-приложением, обратите внимание на наличие встроенного API к вашему языку или платформе. Большинство поисковиков имеют API для всех популярных платформ - Java, PHP, Ruby, Phyton
поддерживаемые
протоколы
- поддерживаемые протоколы - кроме API важны и протоколы доступа, в частности, если вы захотите получить доступ с другого сервера или приложения, к которому нет родного API. Обычно поддерживаются XML-RPC (или разновидности, вроде JSON-RPC), SOAP или доступ через http/socket.
размер
базы и скорость поиска
- размер базы и скорость поиска - эти параметры очень взаимосвязаны и если вы реализуете что-то уникальное и предусматриваете, что у вас могут быть миллионы и больше документов в базе, по которым нужно производить мгновенный поиск, то посмотрите на известные реализации выбранной платформы. Хотя никто не заявляет явно про ограничения на количество документов в базах, и на небольших коллекциях (например, несколько тысяч или десятков тысяч документов) все поисковики будут примерно одинаковые, но если речь идёт о миллионах документов - это может стать проблемой. Кстати говоря, сам по себе этот параметр не всегда имеет значение, нужно смотреть на особенности каждой системы и алгоритмы работы с поиском, а также на другие параметры, например, скорость переиндексации или возможные типы индексов и системы их хранения.
поддерживаемые
типы документов
- поддерживаемые типы документов - конечно, любой сервер поддерживает обычный текст (хотя следует смотреть на возможность работы с многоязычными документами и кодировкой UTF-8), но если вам необходимо индексировать разные типы файлов, например, HTML, XML,
DOC или PDF, то стоит посмотреть на те решения, где есть встроенный компонент для индексации различных форматов и извлечения из них текста. Конечно, все это можно сделать прямо в вашем приложении, но лучше поиска готовые решения. Сюда же относится и поддержка индексирования и поиска информации, которая хранится в СУБД - не секрет, что такое хранение самое распространённое для веб-приложений, и лучше, чтобы поисковый сервер работал напрямую с базой данных, без необходимости вручную извлекать и "скармливать" ему документы для индексирования.
работа
с разными языками и стемминг
- работа с разными языками и стемминг - для корректного поиска с использованием разных языков необходима родная поддержка не только кодировок, но и работа с особенностями языка. Все поддерживают английский язык, который для поиска и обработки достаточно простой, но для русского и других аналогичных необходимо использовать автоматические средства для обеспечения морфологии. Модуль стемминга позволяет склонять и разбирать слова в поисковом запросе для более корректного поиска. Если для вас критичен поиск на русском языке, обратите внимание на присутствие этого модуля и его особенности (конечно, ручной стемминг лучше автоматического, но сложнее, хотя и автоматические есть очень разные).
поддержка
дополнительных типов полей в
документах
- поддержка дополнительных типов полей в документах - кроме самого текста, который индексируется и в котором производится поиск, необходимо наличие возможности хранить в документе неограниченное количество других полей, которые могут хранить мета-информацию о документе, что необходимо для дальнейшей работы с результатами поиска. Очень желательно, чтобы количество и типы полей не ограничивались, а индексируемость полей можно было настраивать. Например: в одном поле хранится название, во втором - аннотация, в третьем - ключевые слова, в четвёртом - идентификатор документа в вашей системе. Необходимо гибко настраивать область поиска (в каждом поле или в указанных), а также те поля, которые будут извлекаться с базы поисковика и выдаваться в результатах поиска.
платформа
и язык
- платформа и язык - это так же важно, хотя и в меньшей степени. Если вы собираетесь выделять поиск в отдельный от приложения модуль или сервер, или даже выносите его на отдельный сервер (железо в смысле), то роль платформы не такая и большая. Обычно это или C++ или Java, хотя есть варианты и для других языков (обычно порты решений на java).
наличие
встроенных механизмов ранжирования и
сортировки
- наличие встроенных механизмов ранжирования и сортировки - особенно хорошо, если поисковик можно расширять (и он написан на известном вам языке) и написать нужные вам реализации этих функций, ведь существует очень много разных алгоритмов, и не факт, что используемый по умолчанию в поисковике вам подойдёт.
системам полнотекстового
поиска:
- Sphinx подойдёт вам, если необходимо индексировать большие объёмы данных в базе MySQL и вам важна скорость индексации и поиска, однако не требуются специфические возможности поиска вроде “fuzzy search” и вы согласны выделить на это отдельный сервер или даже кластер.
- Если необходимо встроить поисковый модуль в ваше приложение, то лучше всего поиска готовые порты для вашего языка к библиотеке Lucene— для всех распространённых языков они есть, однако могут реализовывать далеко не все возможности оригинала. Если же вы разрабатываете приложение на Java, то Lucene однозначно лучший выбор. Однако учтите достаточную медленную индексации и необходимость частой оптимизации индекса (и требовательность к CPU и скорости диска). Для РНР это, по всей видимости, единственный приемлемый вариант полной реализации поиска без дополнительных модулей и расширений.
- Xapian достаточно хороший и качественный продукт, однако менее распространённый и гибкий, чем остальные. Для приложений на С++ и требованиями к широким возможностям языка запроса он будет лучшим выбором, однако требует ручной доводки и модификаций для встраивания в собственный код или использования как отдельного поискового сервера.
Спасибо за внимание!