пятница, 1 апреля 2011 г.

Sitemap Index

Как известно, в файле XML Sitemap должно быть не больше 50 тысяч URL. Если надо больше, то разбиваешь их на отдельные файлы и ещё создаешь Sitemap index, в котором перечисляешь имена всех sitemaps.

Я столкнулся с неожиданной проблемой: поисковики регулярно пытаются затребовать несуществующие sitemap-файлы. Оказывается, всё дело в задержке между чтением sitemap index и sitemaps. Т.е. Google открывает index и начинает идти по списку. Но за сутки он обычно не успевает скачать все наши sitemaps. А на следующий день они перегенерируются заново, а старые файлы затираются.

Почему же он не успевает? Потому что в сумме эти файлы занимают примерно 10 ГБ! Да, у нас очень много всяких разных URL, мы очень любим SEO :)

Ну, хорошо, 10 ГБ. Но почему мы их стираем каждый день? Оказывается, разработчики пошли по самому простому пути: раз в сутки Windows-сервис лезет в разные базы данных и генерирует все возможные URL; он не пытается проверять, это новый адрес или нет, просто генерирует огромный список. Все адреса записываются в файлы со случайными именами, вроде sitemap_9E683351-E092-4298-A4B7-6DFE219E83A7.xml. На следующий день он все стирает и начинает с нуля.

А вот как бы сделал я: все URL лежат в большой таблице базы данных; Windows-сервис использует MERGE, чтобы вставить недостающие строки. Если строка уже существовала, то с помощью того же самого MERGE обновляем её timestamp. Напротив каждой URL записано имя файла (например, sitemap123.xml), которое присваивается навсегда. Нужно ещё предусмотреть уборку мусора (удаление URL, которые не были обнаружены сегодня). Правда, при удалении возникает проблемка: в некоторых файлах окажется меньше 50 тысяч записей. Можно на это просто закрыть глаза, потому что удаление бывает редко. А можно пытаться заполнить "дыры" новыми URL.

Чем это лучше? Ну, во-первых, это решает описанную выше проблему. Во-вторых, уменьшает ненужный трафик от роботов. Ведь идея sitemap index заключается в том, чтобы роботы знали, какие конкретные sitemaps обновились, чтобы им не приходилось качать всё заново. В снижении трафика помогает не только index, но и Conditional GET (Last-Modified / If-Modified-Since): если конкретный sitemap-файл не меняется месяцами, то сервер просто каждый день возвращает HTTP 304 (Not Modified), а не файл целиком (как это делаем мы сейчас).

Ну, и, наконец, к Гуглю и другим поисковикам надо относится с уважением, стараться облегчить их жизнь. И тогда они ответят взаимностью - быстрее проиндексируют новый контент. А мы, получается, каждый день бомбим Гугль миллионами адресов и заставляем его самостоятельно принять решение о том, что индексировать в первую очередь.

Кстати, многие не знают, но на самом деле Гугль не слишком интересуется тем, что ты указал в полях lastmod и freq. Для него гораздо важнее найти такие URL, которые он ещё не видел раньше. Вот их он обычно индексирует в первую очередь, а не обязательно те страницы, которые ты пометил, как обновленные. По-крайней мере, такое поведение я вижу.


Ну, это всё мечты. А пока, как обычно времени не хватает, поэтому решили проблему очень просто: перегенерируем sitemaps не раз в день, а раз в два дня. Ошибок стало меньше.

4 комментария:

Igor Korkhov комментирует...

А можно в двух словах объяснить, зачем надо давать Гуглю миллионы ссылок? Чтобы по запросу "любое говно" ваш сайт был на первом месте? Ведь в этом же состоит суть SEO не в теории, но de facto.

Valik комментирует...

Протокол sitemap предназначен для того, что быстро проинформировать поисковики о появлении новых страниц. В принципе, они сами должны их найти (при условии, конечно, на страницу есть хоить ссылка). Но sitemaps позволяют добиться того же эффекта быстрее, и с меньшей нагрузкой для сервера.

Мы не генерируем совершенно левые страницы по словами вроде "порно" только для такого, чтобы на них попали люди. Это - "чёрное SEO". И Гугль - не дурак, он борется с такими сайтами.

Почти на всех наших страницах действительно есть релевантный контент. Просто если взять всё критерии пользовательского поиска, то получается очень много возможных сочетаний. Для каждого есть своя красивая страница.

Расскажу подробнее при встрече.

Igor Korkhov комментирует...

Ок, расскажешь. Про sitemap я в курсе, мне непонятно, откуда у вас миллионы страниц. А еще мне непонятна арифметика: 10Гб поделить на 10 миллионов дает нам около килобайта на описание ссылки. Вы каждой ссылке посвящения в стихах, причем длинных, пишете? :)

Valik комментирует...

Я так и знал, что надо проверить арифметику, а то ты будешь придираться :) Но поленился.

Честно говоря, эту цифру мне назвали админы, сам не проверял. Наверное, они имели в виду общий объем по всем нашим сайтам (их примерно десяток), а не по одному конкретному.

Ratings by outbrain