ファセット ナビゲーションのベスト プラクティスと 5 つのワースト プラクティス

2014年3月13日木曜日

ファセット ナビゲーションは、検索結果を色や価格帯でさらに絞り込む仕組みです。ユーザーにとって便利な機能ですが、 重複するコンテンツ を持つ URL の組み合わせが数多く生成されてしまうと、検索に悪影響を及ぼすことがあります。例えば、コンテンツが追加されたり更新されたりした際クロールに時間がかかったり、あるいは、複数の重複 URL にシグナルが分散した結果、インデックス登録が正しく行われなかったり、といったことが起こる可能性があります。ここでは、これらの問題を解消し、ファセット ナビゲーション サイトを可能な限り検索エンジンと相性の良いものにする方法を以下のとおり説明します。

ファセット ナビゲーションでフィルタを選択すると URL の組み合わせが多くなる
例: https://www.example.com/category.php?category=gummy-candies&price=5-10&price=over-10


背景

サイトを構築する場合、個別のコンテンツ(つまり 1 つの商品/記事、または 1 つの商品/記事カテゴリ)にアクセスするための URL は 1 つだけ、というのが理想的な状態です。このような URL であれば、特定のコンテンツにアクセスするためのクリック パスやルートは明確で、ホームページやカテゴリ ページからクリックすることでアクセスできます。

検索ユーザーにも Google 検索にも理想的な状態
  • すべての商品/記事ページにアクセスできる明確な動線


    左側はサイトでのユーザーの動線(つまりクリック パス)、右側はアクセスするページです。


  • 個々のカテゴリ ページを表す URL は 1 つ
    https://www.example.com/category.php?category=gummy-candies

    グミのカテゴリ ページ

  • 個々の商品ページを表す URL は 1 つ
    https://www.example.com/product.php?item=swedish-fish

    魚形グミの商品ページ

ファセット ナビゲーションが原因となる望ましくない重複
  • 同じ記事/商品の URL が複数存在する

    カノニカル 重複
    example.com/product.php? item=swedish-fish example.com/product.php? item=swedish-fish&category=gummy-candies&price=5-10
    魚形グミの同じ商品ページに複数の URL でアクセスできてしまう

  • 検索ユーザーや検索エンジンにとってほとんどまたはまったく価値のないカテゴリ ページが大量に存在する

    URL example.com/category.php? category=gummy-candies&taste=sour&price=5-10 example.com/category.php? category=gummy-candies&taste=sour&price=over-10
    Issues
    • [sour gummy candy price five to ten dollars] で検索するユーザーがほとんどいないとすれば何の付加価値も提供しない。
    • 検索エンジンのクローラに何の付加価値も提供しない(「gummy candies」でも「sour gummy candies」でも同じ商品(「fruit salad」)が見つかる)。
    • 同じカテゴリがいくつものバージョンに分かれているため、インデックス登録のシグナルが分散してしまい、サイト所有者に悪影響を及ぼす。
    • 新しいページや更新されたページではなく重複したコンテンツに帯域幅やクローラの処理を費やすことになり、サイト所有者に悪影響を及ぼす。

ファセット ナビゲーションのワースト・プラクティス

ワースト プラクティス 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
人間であれば「,,」のような非標準の URL パラメータを解読できますが、クローラがこのような URL パラメータを解釈するのは難しくなります。Google のクロール チームのソフトウェア エンジニアである Mehmet Aktuna は、「標準以外のエンコードを使用するのは、わざわざ災難を招いているようなものだ」と述べています。キー=値ペアには等号(=)を使用し、複数のパラメータの追加にはアンパサンド(&)を使用してください。
ワースト プラクティス 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
  • トラッキング ID
  • リファラー ID
  • タイムスタンプ
ワースト プラクティス 3: ユーザー生成値を、クロールもインデックス登録も可能だが、検索結果では有用でない(場合によっては無限の)URL パラメータに変換する。
ワースト プラクティス(例: 緯度/経度、「~日前」といったユーザーごとに変動する値を含む 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 をクロールするようにしても、処理が無限になる可能性があるだけで、検索ユーザーにとってはほとんど価値がありません。それよりも、最も一般的な値のカテゴリ ページを公開して追加情報を含めるようにすると、通常の検索結果ページより多くの付加価値を提供できます。ユーザー生成値を使用する場合は、生成値を別のディレクトリに格納し、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& ... のように次々と値を追加するのではなく、Cookie を使って情報を保持するようにします。
ワースト プラクティス 5: 該当する検索結果のない絞り込み条件が表示されている
ワースト プラクティス:
該当する商品が 1 つもない絞り込み条件が選択可能になっている。

該当する結果がない絞り込み条件(この例では price=over-10 )が選択できる状態になっています。これではユーザーがイライラし、検索エンジンで無用な問題が発生する原因にもなります。

ベスト プラクティス:
ユーザーの選択が妥当な場合(つまり商品が存在するとき)にのみリンク/URL が生成されるようにします。該当する商品がないフィルタ条件はグレー表示されるようにします。使い勝手をさらに向上させるには、各フィルタ条件の横に該当する商品数を表示することも検討してください。

検索結果がゼロになる絞り込み条件(ここでは price=over-10 )が選択できないようになっています。これにより、ユーザーが無駄なクリックをする心配がなく、検索エンジンのクローラが不要なページにアクセスすることもありません。
無用な URL をなくしてクロール領域を最小にするには、商品が存在するときにのみ URL が生成されるようにします。これにより、商品が存在しないページが表示されなくなり、ユーザー エクスペリエンスが高まるだけでなく、クローラが認識する URL の数も最小限に抑えることができます。また、ページの商品が一時的に在庫切れになっているわけではなく、今後もそのページに有益なコンテンツが掲載される可能性が低い場合は、 404 ステータス コード を返すことを検討してください。404 を返すことで、ユーザーに対して他のナビゲーション オプションを示すダイアログを表示したり、関連商品を見つけるための検索ボックスを表示したりできます。

ファセット ナビゲーションを新規作成/再設計する際のベスト プラクティス

これからサイトにファセット ナビゲーションを実装する場合は、独自のコンテンツ ページの「クロール領域」(Googlebot がサイト内で認識するすべての URL)を最適化し、重複するページのクロールを減らし、インデックス登録のシグナルを統合するための方法を検討しましょう。以下のようにいくつかの方法があります:
  • クローラがすべてのコンテンツ ページをクロールするのに必要な URL パラメータ(たとえば、アイテムごとに少なくとも 1 つのクリック パスを作成するために必要なパラメータ)を特定します。必要なパラメータとしては、 item-id category-id page などが考えられます。
  • 検索ユーザーにとって価値があるパラメータはどれか、クロールやインデックス登録において重複の原因になるだけの不要なパラメータはどれかを特定します。グミの例では、たとえば「 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" を追加します。このオプションを追加すると、クローラによって不要な URL がクロールされるのを最小限に抑えることができ、ファセット ナビゲーションによってクロール領域(クローラが認識する URL の領域)が極端に大きくなるのを防ぐことができます。なお、rel="nofollow" は不要な URL のクロールをブロックするわけではありません(クロールをブロックできるのは robots.txt の disallow だけです)。ただし、不要な URL へのクロールを許可することで、それらの URL からのインデックス登録のシグナルを、ユーザーにとって有用な URL に統合することもできます。それには、不要な URL に上位の URL への rel="canonical" を追加します。たとえば、 example.com/category.php?category=gummy-candies&taste=sour& price=5-10 rel="canonical" を追加し、上位 URL として example.com/category.php?category=gummy-candies&taste=sour& page=all )(すっぱいグミをすべて表示するページ)を指定します。
    • オプション 2: Robots.txt の disallow
      不要なパラメータを含む URL に、robots.txt でクロールをブロックする /filtering/ ディレクトリを含めます。これにより、すべての検索エンジンが有用なコンテンツを自由にクロールできるようになりますが、不要な URL のクロールはブロックされます。たとえば、有用なパラメータが item、category、taste で、不要なパラメータが session-id と price だとします。例:
      example.com/category.php?category=gummy-candies
      このような URL を、別の有用な 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
      これでこの URL は、robots.txt によってクロールがブロックされます。
      User-agent: *
      Disallow: /filtering/
    • オプション 3: ホストを別々にする
      CDN を使用していない場合(CDN を使用しているサイトでは、上記のようなウェブマスター ツールの柔軟な機能を利用することはできません)は、不要なパラメータを含む URL を別のホストに配置することを検討してください。たとえば、メイン ホスト www.example.com とサブ ホスト www2.example.com を作成します。サブ ホスト(www2)では、 ウェブマスター ツールのクロール速度 を低く設定します(メイン ホストはできるだけ高く設定したままにします)。これにより、メイン ホストの URL は完全にクロールされますが、不要な URL が Googlebot によってクロールされる可能性が低くなります。
      • メイン ホストのすべてのアイテムに、1 つ以上のクリック パスがあることを確認してください。
      • インデックス登録のシグナルを統合したい場合は、サブ ホストからメイン ホストの上位 URL への rel="canonical" を追加することを検討してください(例: www2.example.com/category.php?category=gummy-candies&taste=sour& price=5-10 に rel="canonical" を追加し、上位 URL として 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 )
    • 検索ユーザーにとって有用なパラメータを先に記述し、関連性の低いパラメータ(たとえばセッション ID)を後に記述します。URL が検索に表示されることもあるため、パラメータの順序に一定のルールを設けユーザー エクスペリエンスを高めます。
      • 悪い例
        example.com/category.php? session-id=123&tracking-id=456 &category=gummy-candies&taste=sour
  • rel=”canonical” を使用して、個々のコンテンツ ページのインデックス登録を望ましいページに統合します。rel="canonical" は、ホスト名やドメインをまたがって使用できます。
  • ページ指定されたコンテンツ(たとえば「グミ」カテゴリの page=1、page=2)のインデックス登録を、以下のいずれかの方法で改善します:
    • シリーズを構成する各ページに、カテゴリの「すべて表示」ページへの rel="canonical" を追加します(例: 「グミ」カテゴリの page=1、page=2、page=3 に category=gummy-candies&page=all への rel="canonical" を追加します)。その際に、検索ユーザーのエクスペリエンスを損なわない(各ページがすばやく読み込まれるなど)よう注意してください。
  • コンテンツの並べ替え、フィルタリング、非表示を、URL の更新ではなく JavaScript で動的に行う場合でも、クロールやインデックス登録の対象となるメインのカテゴリ ページや商品ページの URL はユーザーにとって有用な情報です。JavaScript でコンテンツを動的に変更する場合は、サイト全体を表す URL としてホームページのみ(つまり 1 つの URL のみ)を使用することは避けてください。これでは検索ユーザーが、1 つの URL でサイト内のすべてのコンテンツにアクセスすることになってしまいます。また、動的なフィルタリングによってパフォーマンスが低下することがありますので注意してください。これにより、ユーザー エクスペリエンスが損なわれる可能性があります。
  • サイトマップ には canonical URL のみ含めるようにしてください。

サイトに既にファセット ナビゲーションが実装されている場合のベスト プラクティス

前のセクションで説明したベスト プラクティス(たとえば不要な URL の rel="nofollow")は、既存のサイトのファセット ナビゲーションを大幅に再設計する場合にも適用できます。ただし、既存のファセット ナビゲーションの場合は、検索エンジンが認識したクロール領域が既に大きくなっているケースが多いようです。したがって、Googlebot によりクロールされる不要なページを増やさないようにすることと、インデックス登録のシグナルの統合を検討することが重要になります。
  • 可能な場合は、標準のエンコードとキー=値ペアによるパラメータを使用します。
  • ページ コンテンツを変更しない値(セッション ID など)は、ディレクトリではなく標準のキー=値ペアとして実装されていることを確認します。
  • 特定のカテゴリ/フィルタに商品が存在しない場合には、クリック可能なアンカーを使用しないようにします(つまり、フィルタを実行して該当するアイテムが見つからない場合には、クリックされたり、URL が生成されたりしないようにします)。
  • URL パラメータが論理的に表示されるようにします。
    • 値を次々と追加するのではなく、不要なパラメータを削除するようにします(例: example.com/product? cat=gummy-candy&cat=lollipops &cat=gummy-candy&item=swedish-fish のような URL は避けます)。
  • 検索ユーザーにとって有用なパラメータを先に記述し、関連性の低いパラメータ(たとえばセッション ID)を後に記述します。URL が検索に表示されることもあるため、パラメータの順序に一定のルールを設けユーザー エクスペリエンスを高めます(例: example.com/category? session-id=123&tracking-id=456 &category=gummy-candies&taste=sour& ではなく example.com/category.php?category=gummy-candies&taste=sour& session-id=123&tracking-id=456 とします)。
  • サイトでの URL パラメータの動作について十分に理解している場合は、 ウェブマスター ツールの URL パラメータ を設定します(この場合でも、個別のアイテム/記事へのクリック パスを明確にする必要はあります)。たとえば、ウェブマスター ツールの URL パラメータを使用すると、パラメータ名、ページ コンテンツに対するパラメータの効果、Googlebot がパラメータを含む URL をクロールする方法などを一覧表示できます。


    ウェブマスター ツールの URL パラメータを使用すると、サイトのパラメータに関する情報や Googlebot の動作に関する推奨事項を確認できる

  • コンテンツの並べ替え、フィルタリング、非表示を、URL の更新ではなく JavaScript で動的に行う場合でも、クロールやインデックス登録の対象となるメインのカテゴリ ページや商品ページの URL はユーザーにとって有用な情報です。JavaScript でコンテンツを動的に変更する場合は、サイト全体を表す URL としてホームページのみ(つまり 1 つの URL のみ)を使用することは避けてください。これでは検索ユーザーが、1 つの URL でサイト内のすべてのコンテンツにアクセスすることになってしまいます。また、動的なフィルタリングによってパフォーマンスが低下することがありますので注意してください。これにより、ユーザー エクスペリエンスが損なわれる可能性があります。
  • rel=”canonical” を使用して、個々のコンテンツのインデックス登録を望ましいページに統合します。rel="canonical" は、ホスト名やドメインにまたがって使用できます。
  • ページ指定されたコンテンツ(たとえば「グミ」カテゴリの page=1、page=2)のインデックス登録を、以下のいずれかの方法で改善します:
    • シリーズを構成する各ページに、カテゴリの「すべて表示」ページへの rel="canonical" を追加します(例: 「グミ」カテゴリの page=1、page=2、page=3 に category=gummy-candies&page=all への rel="canonical" を追加します)。その際に、検索ユーザーのエクスペリエンスを損なわない(各ページがすばやく読み込まれるなど)よう注意してください。
  • サイトマップ には canonical URL のみ含めるようにしてください。
シンプルなままにしておけるなら、それがベストであるということは覚えておいてください。ご不明な点がありましたら、 ウェブマスター ヘルプ フォーラム まで質問をお寄せください。