Работа С Url-Адресами И Их Хранение

Что ж, вот одна из самых вкусных частей базы данных — она хранит миллиарды различных ссылок и обращается к ним в случайном порядке.

Во-первых, вы явно можете заметить, что все URL-адреса сгруппированы внутри сайта, т. е.

все ссылки внутри 1 сайта могут храниться вместе для скорости.

Я выделил URL сайта и стал хранить список сайтов отдельно — сейчас их 600 тысяч и с ними легко справится отдельная таблица базы данных, описанная ранее.

В памяти всегда есть AVL-дерево с CRC всех известных сайтов, и, предварительно проверив наличие URL-адреса, я получаю идентификатор соответствующего ему сайта, если он уже есть в базе данных.

Я обрезаю остальную часть ссылки — кроме имени сайта, и вычисляю для нее CRC, назовем его Хэшем.

Таким образом, любая ссылка имеет относительно уникальный индекс (идентификатор сайта, хеш).

Все ссылки можно отсортировать по Хэшу внутри отдельного сайта, и тогда вы сможете легко искать существующую или нет — пробегайтесь по списку всех ссылок на данном сайте, пока не встретите нужный Хэш или не увидите Хэш большего размера — это значит, что связи нет. Ускорение не очень большое, но все равно в 2 раза в среднем.

Надо сказать, что я присвоил каждой ссылке идентификатор, чтобы она занимала меньше места в индексе — 4 байта вместо 2*4. В отдельной таблице содержатся данные ID — (ID сайта, Хэш) для быстрой выборки.

Теперь немного о том, как хранить списки из миллиона ссылок и даже сортировать их по 600 тысячам сайтов.

Для этого реализован другой тип таблицы - с двумерным индексом, т.е.

сначала с помощью ID1 мы получаем доступ к списку данных, отсортированных по ID2, причем конкретно ID2 не обязательно должен быть от 1 до N, как это делается в большинстве случаев.

Я также использовал такую таблицу для хранения обратного индекса, но теперь там работает более эффективное решение.

Сама таблица реализована таким образом, что добавление ID2 в список сохраняет список отсортированным.

Все данные об URL-адресах разделены на 64 части по ID1, таблица K содержит записи о сайтах с ID%64=K, каждая таблица разделена на сегменты, выделенные для каждого конкретного ID1. Когда вам нужен доступ к определенному списку записей — по ID1, все они уже подряд лежат на диске, и вы сразу знаете позицию, где искать и с чего начинать буферизованное чтение.

Читаем ровно до тех пор, пока не встретим нужный Хэш Вставка в такую таблицу происходит не очень быстро; с другой стороны, большой кэш и небольшой объем одной записи позволяют довольно быстро вставлять пакетно.

Пакет обновления накапливается — теперь на каждую таблицу приходится примерно 32 000 ссылок, затем он вставляется за 1 проход — делается временная копия таблицы, в которую сливаются данные из кэша и старой таблицы.

URL-адреса с www и без него считаются одинаковыми — в зависимости от того, на каком из них была первая ссылка, он считается основным — он будет добавлен в базу данных, и к нему будут прилеплены все остальные ссылки.

Это позволяет избежать необдуманного отрезания или не отрезания www - ведь сайт может не работать без www, но не решает полностью всех проблем, связанных с тем, что по адресам с www и без него могут быть разные сайты.

Самая кропотливая работа была при разрешении относительных ссылок — пример: на странице «site.ru/index» есть ссылка «.

/», тогда она должна разрешиться на «site.ru/»; однако, если вы добавите косую черту к первой ссылке: «site.ru/index/», и хотя это может быть та же страница на сайте, разрешенной ссылкой будет «site.ru/index/», поэтому вы не сможете обрезать убрать косую черту в конце, аргументы ссылки и имя исполняемого файла обрезать нельзя.

В общем, я делю ссылку на части: протокол, сайт, путь, имя файла, аргументы, именованная ссылка (все после #) Из двух вырезанных вот так ссылок собираю новую, просматривая список и подставляя в результат недостающие элементы (при необходимости).

Тогда нельзя забывать, что существуют конструкции вида «.

/.

/.

/.

/.

/» и их необходимо удалить, так же как и «.

/.

/.

/», а затем удалить или заменить «#», ? В целом процесс не долгий, но очень утомительный по придумыванию тестов и способов обработки всех возможных комбинаций.

Но когда я это написал, всё уже работает как надо Полный контент и список моих статей в поисковике будут обновляться здесь: http://habrahabr.ru/blogs/search_engines/123671/ Теги: #url #БД #обработка ссылок #Поисковые технологии

Вместе с данным постом часто просматривают: