Как устроена поисковая система
Целью поисковых систем, как известно, является предоставление материала, максимально соответствующего введенному пользовательскому запросу. Существует множество вариантов алгоритмов - в этом материале мы затронем лишь те, которые напрямую касаются веб-мастеров и оптимизаторов, а именно алгоритмы популярных поисковых систем типа Яндекса, Google, Rambler и других крупнейших поисковиков, пользующихся популярностью.
Классические поисковые машины, такие как описанные выше, состоят из двух частей, работающих параллельно друг с другом вместе:
- Индексатор - система, скачивающая документы (HTML-файлы, картинки, Flash), представляющие интерес для пользователя, и разбивающая их на слова, лексемы, токены, принятые для хранения в базе данных;
- Поисковый механизм - набор программного обеспечения, предоставляющий доступ к хранимой информации в соответствии с запросом пользователя.
Получение информации из сети.
Для получения информации с целью последующего индексирования используются приложения, называющиеся достаточно своеобразно, - пауки (от англ. Spider). Также распространенными терминами являются Crawler или Бот (англ. Bot).
Задача любого «паука» - обойти как можно больше документов в сети в заданное время, обеспечив полноту поиска (количество документов) и его актуальность (свежесть документов, хранящихся в индексе поисковика). Переход от документа к документу происходит по ссылкам - если один документ ссылается на другой, то второй добавляется в список документов, подлежащих обходу.
Как правило, поисковая машина запускает одновременно тысячи таких модулей, каждый из которых сканирует свой сегмент, ограниченный доменом или набором документов, стоящих в очереди на сканирование. Дожидаться скачивания документов по очереди не имеет смысла, так как каждый документ не зависит от другого. У всех пауков должен быть диспетчер, регулирующий их обращения к сайтам и распределяющий нагрузку на запрашиваемые сервера. Было бы неразумным отправить тысячу запросов к одному и тому же серверу и перегрузить его.
Для скачивания пауки пользуются таким же протоколом получения информации с сервера, что и обычные браузеры, - протоколом HTTP. Поэтому они должны «видеть» то же самое, что и обычный пользователь, за исключением ненужной им информации (например, картинки в случае текстовой поисковой системы). Предоставление пауку и пользователю разной информации называется клоакингом (cloaking), считается нарушением правил и может быть наказано владельцами поисковых машин исключением из индекса (отсутствием сайта в индексном файле, по которому производится поиск и, как следствие, отсутствием сайта в результатах выдачи).
Если в какой-то момент документ не может быть скачан, то паук делает попытку скачать документ позже. После некоторого количества неуспешных попыток документ удаляется из индексного файла и, как следствие, из результатов поиска, если он там находился.
Скачивание может быть организовано по разным принципам: в ширину, в глубину, по PageRank или индексу цитируемости, однако его задача остается одной - свести к минимуму сетевой поток при получении максимума информации. Роботам скачивания активно помогают управляющие (или подсказывающие) конструкции на каждом сайте: файлы robots.txt (определяющие, что разрешено скачивать, а что нет), мета-тэги nofollow, noindex (указывающие, стоит ли переходить по ссылкам в данном документе или хранить его), а также такие разработки, как sitemaps, рекомендующие роботу скачивания особо актуальные страницы.
Хранение информации
Большинство доступных в сети поисковых машин построены на основе инвертированного индекса - скачиваемые документы разбиваются на слова, а затем по словам составляется таблица соответствий слов и документов, содержащих эти слова. Классическим примером инвертированного индекса является глоссарий терминов в конце книги, указывающий на какой странице (или в каком документе в терминах поисковой системы) встречается указанный термин. Работа с таким типом индексов намного выгоднее, например, того же прямого поиска: в случае инвертированного индекса мы берем номера страниц, на которых встретилось слово, и выдаем пользователю соответствующие страницы, а при прямом поиске мы вынуждены были бы пролистать книгу заново, ища места соответствия.
При индексации первым делом документ преобразуется в текстовый вид с использованием различных модулей обработки форматов или парсеров (от англ. parser). Современные системы индексируют и ищут не только текстовые и html-документы. Они работают со множеством форматов, например, pdf, doc, swf и т.д. Парсер обязан распознать формат документа и выделить содержимое, сохранив его структуру: информацию о заголовках, списках, предложениях, определениях и прочих элементах разметки, относящихся не к оформлению текста, а к его структуре. Структура документа используется для учета веса слов (term weight) в нем при поиске: слова, содержащиеся в заголовке самого документа, имеют больший вес перед теми же словами, содержащимися в заголовках перед параграфами в документе. В свою очередь слова в заголовках в самом документе (например h1-h6 в случае стандарта html) имеют большее значение при поиске, чем слова из параграфов или нумерованных списков и т.д. В соответствии со структурой каждому слову присваивается вес.
Документы, состоящие из предложений, бьются на слова (токены). Чаще всего разбиение производится по пробелам, переводам строк и прочим символам, являющимся признаками разрыва слов. Иногда к признакам разрыва относят смену регистра букв или смену буквенно-числовых последовательностей - в этом случае слово «CanonEos888» будет разделено на три: «Canon», «Eos» и «888». Раздельные слова приводятся к унифицированному виду (нормализуются), например по падежу, числу или роду. Таким образом одинаковые слова, находящиеся в разных формах преобразовываются к одному и тому же виду. Во-первых, это позволяет более точно работать с дальнейшим поиском по документам: определив количество вхождений разных форм одного и того же слова (частота термина в документе) в искомый документ, мы можем более точно выдать документы, соответствующие (релевантные) поисковому запросу, сортируя (ранжируя) их по степени соответствия. А во-вторых, используя механизмы нормализации слов, мы можем более точно выдать пользователю результаты на его запрос, содержащий форму слова, отличную от формы этого же слова в подходящем документе: например, в документе может содержаться словосочетание «хорошей машины», и этот документ обязан быть показан пользователю в соответствии с запросом «хорошая машина».
Безусловно, конечный (разбитый на токены) текст, предназначенный для внутреннего использования, может выглядеть достаточно забавно: например, предложение «Собака бежала по полю, где было много львов» преобразуется в «Собака бежать поле/полоть есть много лев/Львов», однако его «забавность» наилучшим образом подходит для хранения информации и дальнейшего поиска по ней. Заметьте, что в случае использования упрощенных алгоритмов, не опирающихся на семантику текста, не всегда удается точно установить часть речи, что приводит к двойственности и неоднозначности некоторых терминов (дизамбигуации).
При использовании алгоритма инвертированного индекса возникает ряд ограничений к файлу индекса для того, чтобы не допустить чрезмерного его разрастания. Например, союз «и» или предлог «на», встречающийся достаточно часто в каждом документе или даже предложении, привел бы к тому, что таблица соответствия этих слов и страниц, содержащих слова, содержала бы миллионы значений. Это существенно бы снизило скорость поиска (учитывая скорости доступа к большим объемам информации), никак не повлияв на его качество (поиск подобных слов крайне редко востребован на практике).
Для того чтобы избежать подобных ситуаций, на этапе индексирования вводятся ограничения в виде стоп-слов, игнорируемых индексатором. Чтобы не «забивать» индексный файл лишними словами, в подобные списки попадают чрезмерно короткие слова, а также наиболее часто употребляемые предлоги, артикли и другие слова, редко использующиеся при поиске, но часто использующиеся в документах. Как пример, файл стоп-слов российского поискового ПО Яndex.Server содержит такие слова, как «где», «который», «какой», «ваш» и т.д. Эти же слова обрезаются и не учитываются при запросе к базе данных, поскольку они не попадают туда при индексации.
Полученный набор слов сравнивается рядом алгоритмов на предмет поиска дублей в базе. В Яндексе используется алгоритм шинглов, о котором можно прочесть в соответствующей статье. Простейшая проверка состоит в подсчете контрольных сумм всех слов текста или части слов, ограниченных каким либо признаком (например, в расчете контрольной суммы принимают участие только существительные). Документы, сочтенные дублями, либо не участвуют в поиске, либо участвуют, но помещаются в конец результата выдачи.
http://www.uniplace.ru