Фасетная навигация сайта - хорошие и плохие примеры

В данной статье (уровень веб-мастера - продвинутый) речь пойдёт о, пересекающейся по разным признакам, т.н. "фасетной" навигации. Для упрощения усвоения материала рекомендую пробежаться по статье в Википедии "Фасетная классификация" и публикации на английском языке (но с картинками!) "Design better faceted navigation for your websites".

Фасетная навигация с фильтрацией по цвету или ценовому диапазону может быть полезна для ваших посетителей, но зачастую вредит в поиске из-за того, что создаёт множество комбинаций адресов с дублирующимся контентом. Из-за дублей поисковые системы не смогут быстро сканировать сайт на предмет обновлений контента, что соответственно влияет и на индексацию.  Чтобы минимизировать эту проблему и помочь веб-мастерам сделать фасетную навигацию дружелюбной в отношении поиска, мы бы хотели:

Фильтрация выбора фасетной навигации может вызвать множество комбинаций URL,
такие как http://www.example.com/category.php?category=gummy-candies&price=5-10&price=over-10

В идеальном состоянии уникальный контент, будь то индивидуальный продукт (статья) или категория товаров (статей), должен иметь разумный путь кликов и только один URL, доступный посетителю со страницы категории или главной страницы сайта.

Идеально для пользователей и поиска Google

Чёткий путь к продуктам/страницам статьи:

Слева показана реализация структуры навигации (путь кликов), справа показан структура ссылок для этой навигации

Представление URL для страницы категории:
http://www.example.com/category.php?category=gummy-candies

Страница категории для мармелада

Представление URL для конкретного продукта:
http://www.example.com/product.php?item=swedish-fish

Страница конкретного продукта: жевательный мармелад "Шведская рыбка"

Нежелательные дубликаты, вызванные фасетной навигацией

Одна и та же страница доступна с различных веб-адресов:

Каноническая страница


URL: example.com/product.php?item=swedish-fish

Дублированная страница


URL:example.com/product.php?item=swedish-fish&category=gummy-candies&price=5-10

Страницы нумерации категорий, не представляющие ценность для поисковых систем:


URL: example.com/category.php?category=gummy-candies&taste=sour&price=5-10

Ошибки:
  • Бессмысленно для Google, так как пользователи редко ищут [мармелад по цене 9:55 долларов].
  • Бессмысленно для поисковых роботов, которые обнаружат один и тот же элемент ("фруктовый салат") от родительских страниц категорий (либо "Жевательный мармелад" или "кислый Жевательный мармелад").
  • Отрицательный момент для владельца сайта, потому запросы на индексацию разбавляются многочисленными версиями одной и той же категории.
  • Отрицательный момент для владельца сайта, потому что это бесполезная и лишняя нагрузка в пропускной способности сайта

Пустые страницы:


URL: example.com/category.php?category=gummy-candies&taste=sour&price=over-10

Ошибки:
  • Неправильно отдаётся код для поисковых систем (в таком случае страница должна отдавать код 404)
  • Пустая страница для пользователей

Наихудшие решения (не дружелюбные в отношении поиска) фасетной навигации

Пример №1: В составе URL применяются не стандартные параметры: запятые и скобки, вместо ключ=значение&:

  • example.com/category?[ category:gummy-candy ][ sort:price-low-to-high ][ sid:789 ]
  • example.com/category?category,gummy-candy,,sort,lowtohigh,,sid,789

Как надо:
example.com/category?category=gummy-candy&sort=low-to-high&sid=789

Пример №2: Использование каталогов или путей к файлам, а не параметров в списках значений, которые не изменяют содержание страницы:
example.com/c123/s789/product?swedish-fish
(где /c123/ категория, /s789/ ID сессии,  что не изменяет содержимое страницы)

Хорошее решение:
  • example.com/gummy-candy/product?item=swedish-fish&sid=789 (каталог, /gummy-candy/, меняет содержимое страницы в значимым образом)

Лучшее решение:
  • example.com/product?item=swedish-fish&category=gummy-candy&sid=789 (параметры URL дают большую гибкость для поисковых систем, чтобы определить, как эффективно сканировать)

Поисковым роботам трудно дифференцировать полезные значения (например, "gummy-candy") от бесполезных (например, "SESSIONID"), когда эти значения помещаются непосредственно в пути ссылки. С другой стороны, параметры URL обеспечивают гибкость для поисковых систем, чтобы быстро проверить и определить, когда данное значение не требует доступ сканирующего робота (краулера) ко всем всем вариантам.

Общие значения, которые не меняют содержимое страницы и должны быть перечислены в качестве параметров URL, включают:
  • ID сессии
  • Отслеживание идентификаторов
  • Referrer идентификаторы
  • Отметки времени

Пример №3:  Преобразование созданных пользователями значений (возможно бесконечных) в параметры URL, которые доступны для сканирования и индексирования, но бесполезны для поиска.
Использование незначительных данных, генерируемых пользователями сайта  (например,  как долгота/широта или "дней назад"), в сканируемых и индексируемых адресах:

  • example.com/find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/article?category=health&days-ago=7

Как надо:
  • example.com/find-a-doctor?city=san-francisco&neighborhood=soma
  • example.com/articles?category=health&date=january-10-2014

Вместо того, чтобы позволить пользователем генерировать значения для создания сканируемых URL-адресов (что приводит к бесконечным возможностям с очень небольшой ценностью для посетителей), лучше публиковать категорию страницы для наиболее популярных значений, вдобавок можно включать дополнительную информацию, чтобы страница представляла большую ценность, чем обычная поисковая cтраница с результатами. Кроме того, можно подумать о размещении сгенерированных пользователем значениях в отдельном каталоге, а затем через robots.txt запретить сканирование из этого каталога.

  • example.com/filtering/ find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/filtering/ articles?category=health&days-ago=7

И в robots.txt:
User-agent: *
Disallow: /filtering/

Пример №4. Добавление параметров URL без логики.
  • example.com/gummy-candy/lollipops/gummy-candy/gummy-candy/product?swedish-fish
  • example.com/product?cat=gummy-candy&cat=lollipops&cat=gummy-candy&cat=gummy-candy&item=swedish-fish

Хорошее решение:
  • example.com /gummy-candy/product?item=swedish-fish

Лучшее решение:
  • example.com/product?item=swedish-fish&category=gummy-candy

Посторонние параметры URL только увеличивают дублирование, в результате сайт менее эффективно сканируется и индексируется. Поэтому необходимо избавляться от ненужных параметров URL и периодически заниматься уборкой мусорных ссылок перед генерацией новых URL. Если многие параметры необходимы для пользовательского сеанса, можно скрыть информацию в куки, а не постоянно добавлять значения, как cat=gummy-candy&cat=lollipops&cat=gummy-candy& ...

Пример №5: Предлагать дальнейшие уточнения (фильтрация), когда есть нулевые результаты.

Плохо:
Разрешать пользователям выбрать фильтры, когда существуют нулевые элементы для уточнения.


Уточнение к странице с нулевыми результатами (например, price=over-10), что расстраивает пользователей и вызывает ненужные запросы для поисковых систем.

Как надо:
Создавать ссылки только тогда, когда есть элементы для выбора пользователем. При нулевом результате ссылку помечать "серой" (т.е. недоступной для клика). Для дальнейшего улучшения юзабилити рассмотреть вопрос о включении показателя количества доступных элементов рядом с каждым фильтром.


Вывод страницы с нулевыми результатами (например, price=over-10) не допускается, плюс запрещается пользователям делать ненужные клики, а поисковым система сканировать эту не полезную страницу.

Необходимо предотвращать появление ненужных адресов и минимизировать пространство для посетителя, создавая URL только при наличии продукции. Это поможет пользователям оставаться занятыми на вашем сайте (меньше кликов по кнопке назад, когда не находится ни одного товара), уменьшит число возможных URL, известных поисковым системам. Кроме того, если страница не просто "временно нет в наличии", а вряд ли когда-нибудь будет содержать релевантную информацию, стоит рассмотреть возможность сделать для неё код ответа 404 . На 404-ой странице вы можете оформить полезное сообщение для пользователей с большим количеством опций в навигации или окно поиска, чтобы пользователи могли найти родственные продукты.

Рекомендации по реализации новой фасетной навигации или её "редизайну"

Для новых сайтов, веб-мастера которых рассматривают внедрение фасетной навигации, есть несколько вариантов оптимизации сканирования (совокупность адресов на вашем сайте, известных роботу Google) уникальных страниц контента и уменьшения попадания в индекс поисковой системы дублирующихся страниц (консолидация сигналов индексации).

Определите, какие параметры URL требуются для поисковых систем, чтобы сканировать каждую индивидуальный страницу с контентом (то есть, определить, какие параметры необходимы для создания, по меньшей мере одного клик-пути к каждому пункту). Обязательные параметры могут включать в себя item-id, category-id, page т.д.

Определите, какие параметры будут полезны для посетителей с их запросами, и какие скорее всего только вызовут дублирование при сканировании и индексировании. В примере с кондитерскими товарами (мармелад) параметр URL "taste " может быть ценным для пользователей с запросами [sour gummy candies] в примере example.com/category.php?category=gummy-candies&taste=sour. Тем не менее, логично посчитать параметр "price" вызывающим лишнее дублирование category=gummy-candies&taste=sour&price=over-10. Другие распространенные примеры:
  • Ценные параметры для поисковиков: item-id, category-id, name, brand ...
  • Ненужные параметры: session-id, price-range ...

Рассмотрим реализацию одного из нескольких вариантов конфигурации для URL-адресов, которые содержат ненужные параметры. Просто убедитесь, что "ненужные" параметры URL действительно не требуются для сканирования поисковым роботам или для нахождения пользователем каждого отдельного продукта!

Вариант 1: rel="nofollow" и внутренние ссылки

Пометьте все ненужные URL-адреса атрибутом rel="nofollow". Это уменьшит трудозатраты поискового робота и предотвратит снижение частоты сканирования. Глобально управлять сканированием нужно через robots.txt (Примеч. переводчика: см. статью "О сканировании, индексировании и ранжировании").
Воспользуйтесь атрибутом rel="canonical", чтобы отделить страницы для поискового индекса от страниц, не нужных там (например на странице example.com/category.php?category=gummy-candies&taste=sour& price=5-10 можно прописать атрибут rel="canonical", указывающий на категорию всего кислого мармелада example.com/category.php?category=gummy-candies&taste=sour& page=all).

Вариант 2: Robots.txt и Disallow

URL-ы с ненужными параметрами включают в директорию /filtering/, которая будет закрыта в robots.txt (запрет disallow). Это даст всем поисковым системам сканировать только "правильное" внутриссылочное (содержимое) сайта, но будет блокировать разом сканирование нежелательных URL. Например (example.com/category.php?category=gummy-candies), если ценными параметрами были item, category и taste, и лишними были идентификатор сеанса и price, то URL будет для taste таким:
example.com/category.php?category=gummy-candies&taste=sour, но все ненужные параметры, такие как price, URL включит в предопределенный каталог - /filtering/:
example.com/filtering/category.php?category=gummy-candies&price=5-10,
который затем через robots.txt будет запрещен:
User-agent: *
Disallow: /filtering/ 

Вариант 3: Раздельные хосты

Если вы не используете CDN (сайты, реализованные с помощью CDNs не имеют такой информативной гибкости в "Инструментах для веб-мастеров" или WMT, если кратко), то стоит рассмотреть вопрос о размещении каких-либо документов с ненужными параметрами на отдельном хосте: например, создан основной хост www.example.com и вторичный www2.example.com. На вторичном хосте (www2) можете установить скорость сканирования в Webmaster Tools на "низкий", сохраняя при этом скорость сканирования главного хоста высокой. Это позволит поисковым роботам лучше сканировать основные адреса на главном хосте и снизит приоритет для изучения роботами ненужных ссылок.

Убедитесь в сохранении пути кликов для для всех товаров на главном хосте.

Если вы хотите оптимизировать сигналы индексации, рассмотрите вопрос включения атрибута rel="canonical" в ссылки вторичного хоста с указанием на каноническую страницу главного хоста (например на странице www2.example.com/category.php?category=gummy-candies&taste=sour& price=5-10 можно прописать атрибут rel="canonical", указывающий на категорию всего кислого мармелада www.example.com/category.php?category=gummy-candies&taste=sour& page=all).

Предотвратите появление интерактивных ссылок, когда не существует ни одного продукта для категории/фильтра.

Добавьте логику отображения параметров URL

Удалите ненужные параметры и не добавляйте постоянно новые значения.
Избегайте таких бесконечных ссылок: example.com/product? cat=gummy-candy&cat=lollipops &cat=gummy-candy&item=swedish-fish

Сохраняйте ценные параметры в URL, перечислив их в первую (так как URL видны в результатах поиска) очередь, и менее уместные параметры в последнюю (например, идентификатор сессии).
Избегайте подобной структуры ссылок: example.com/category.php?session-id=123&tracking-id=456 &category=gummy-candies&taste=sour

Улучшите индексацию различных страниц одного контента указанием атрибута rel="canonical" на привилегированную версию страницы. Атрибут  rel="canonical" может быть использован внутри одного и нескольких доменов.

Оптимизируйте индексацию контента, разбитого на страницы "паджинации" (например, page=1 и page=2 из категории "gummy candies") посредством (либо):
  • Добавьте атрибут rel="canonical" в серию страниц с указанием канонической категории с параметром “view-all” (например, page=1, page=2, и page=3 из категории "gummy candies" с with rel=”canonical” на category=gummy-candies&page=all), удостоверившись, что страница необходима пользователям и загружается быстро.
  •  Используйте разметку разбиения на страницы rel="next" и rel="prev", чтобы указать на связь между отдельными страницами (см. статью "Paginaton with rel="next" and rel="prev"") .

Убедитесь, что при использовании JavaScript для динамического управления контентом (sort/filter/hide) без обновления URL, есть реальные веб-адреса на вашем сайте, имеющие ценность в поиске, например, это основные категории и страницы продуктов, которые доступны для сканирования и индексирования. Старайтесь не использовать только домашнюю страницу (т.е. один URL) для всего вашего сайта, а через JavaScript динамически изменять контент навигацией - это, к сожалению, выдаст в поиске пользователям только один URL. Кроме того, проверьте, чтобы производительность не повлияла на работу динамической фильтрации в худшую сторону, так как помешает пользователю работать с сайтом.

Включите только канонические ссылки в файлы Sitemap

Рекомендации по существующим сайтам с фасетной навигацией

Убедитесь, что лучшие решения, перечисленные выше (например, rel="nofollow" для ненужных адресов) все еще применяются. В противном случае поисковые системы уже сформировали большую ссылочную массу в индексе. Таким образом, ваша работа будет направлена ​​на снижение дальнейшего роста ненужных страниц, просмотренных с помощью робота Google и консолидацию сигналов индексации.

Используйте параметры со стандартной кодировкой и форматом ключ=значение (key=value).

Убедитесь, что значения, которые не меняют содержимое страницы, такие как идентификаторы сеансов, реализованы в виде ключ=значение, а не каталогов.

Не позволяйте кликать и не генерируйте URL-адреса, когда не существует элементов для фильтра.

Добавьте логику в отображение параметров URL: удалите ненужные параметры, а не добавляйте постоянно значения (например, избегайте такой генерации ссылки: example.com/product?cat=gummy-candy&cat=lollipops&cat=gummy-candy&item=swedish-fish).

Сохраняйте ценные параметры в URL, перечислив их в первую (так как URL видны в результатах поиска) очередь и менее уместные параметры в последнюю (например, идентификатор сессии).
Избегайте подобной структуры ссылок: example.com/category.php?session-id=123&tracking-id=456 &category=gummy-candies&taste=sour
Настройте параметры URL в Инструментах для веб-мастеров, если имеете чёткое представление о работе ссылок на вашем сайте.

Убедитесь, что при использовании JavaScript для динамического управления контентом (sort/filter/hide) без обновления URL, есть реальные веб-адреса на вашем сайте, имеющие ценность в поиске, например, это основные категории и страницы продуктов, которые доступны для сканирования и индексирования. Старайтесь не использовать только домашнюю страницу (т.е. один URL) для всего вашего сайта, а через JavaScript динамически изменять контент навигацией - это, к сожалению, выдаст в поиске пользователям только один URL. Кроме того, проверьте, чтобы производительность не повлияла на работу динамической фильтрации в худшую сторону, так как помешает пользователю работать с сайтом.

Улучшите индексацию различных страниц одного контента указанием атрибута rel="canonical" на привилегированную версию страницы. Атрибут  rel="canonical" может быть использован внутри одного и нескольких доменов.

Оптимизируйте индексацию контента, разбитого на страницы "паджинации" (например, page=1 и page=2 из категории "gummy candies") посредством (либо):
  • Добавьте атрибут rel="canonical" в серию страниц с указанием канонической категории с параметром “view-all” (например, page=1, page=2, и page=3 из категории "gummy candies" с with rel=”canonical” на category=gummy-candies&page=all), удостоверившись, что страница необходима пользователям и загружается быстро.
  •  Используйте разметку разбиения на страницы rel="next" и rel="prev", чтобы указать на связь между отдельными страницами (см. статью "Paginaton with rel="next" and rel="prev"") .

Включите только канонические ссылки в файлы Sitemap.



Автор: +Maile Ohye, Developer Programs Tech Lead, and Mehmet Aktuna, Crawl Team
Перевод: Aldous
Оригинал: "Faceted navigation best (and 5 of the worst) practices".

Полезные ссылки:
Видеовстреча с веб-мастерами - 13.02.14 - Структура сайтов
Дублированный контент
Видеовстреча с веб-мастерами - 13.06.13 - Электронная торговля.