ファセット ナビゲーションは、検索結果を色や価格帯でさらに絞り込む仕組みです。ユーザーにとって便利な機能ですが、重複するコンテンツを持つ URL の組み合わせが数多く生成されてしまうと、検索に悪影響を及ぼすことがあります。例えば、コンテンツが追加されたり更新されたりした際クロールに時間がかかったり、あるいは、複数の重複 URL にシグナルが分散した結果、インデックス登録が正しく行われなかったり、といったことが起こる可能性があります。ここでは、これらの問題を解消し、ファセット ナビゲーション サイトを可能な限り検索エンジンと相性の良いものにする方法を以下のとおり説明します。
- ベスト プラクティス
ファセット ナビゲーションでフィルタを選択すると URL の組み合わせが多くなる
例:
http://www.example.com/category.php?category=gummy-candies&price=5-10&price=over-10
背景
サイトを構築する場合、個別のコンテンツ(つまり 1 つの商品/記事、または 1 つの商品/記事カテゴリ)にアクセスするための URL は 1 つだけ、というのが理想的な状態です。このような URL であれば、特定のコンテンツにアクセスするためのクリック パスやルートは明確で、ホームページやカテゴリ ページからクリックすることでアクセスできます。
検索ユーザーにも Google 検索にも理想的な状態
- すべての商品/記事ページにアクセスできる明確な動線
- 個々のカテゴリ ページを表す URL は 1 つ
http://www.example.com/category.php?category=gummy-candies
- 個々の商品ページを表す URL は 1 つ
http://www.example.com/product.php?item=swedish-fish
- 同じ記事/商品の URL が複数存在する
魚形グミの同じ商品ページに複数の URL でアクセスできてしまうカノニカル 重複 example.com/product.php? item=swedish-fish
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
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」)が見つかる)。
- 同じカテゴリがいくつものバージョンに分かれているため、インデックス登録のシグナルが分散してしまい、サイト所有者に悪影響を及ぼす。
- 新しいページや更新されたページではなく重複したコンテンツに帯域幅やクローラの処理を費やすことになり、サイト所有者に悪影響を及ぼす。
- 検索エンジンに何の価値も提供しない(404 ステータス コードを返すべき)。
- 検索ユーザーに悪影響を及ぼす。
ファセット ナビゲーションのワースト・プラクティス
ワースト プラクティス 1: パラメータに標準的でない URL エンコードを使用している(「キー=値」ペアではなくカンマやかっこなどを使用している)ワースト プラクティス:ワースト プラクティス 2: ページ コンテンツを変更しない値を、パラメータではなくディレクトリやファイル パスとして追加する
example.com/category?[category:gummy-candy][sort:price-low-to-high][sid:789]
- キー=値ペアに = ではなく : が使用されている
- 複数のパラメータが & ではなく [ ] で追加されている
example.com/category?category,gummy-candy,,sort,lowtohigh,,sid,789
ベスト プラクティス:
- キー=値ペアに = ではなく , が使用されている
- 複数のパラメータが & ではなく ,, で追加されている
人間であれば「,,」のような非標準の URL パラメータを解読できますが、クローラがこのような URL パラメータを解釈するのは難しくなります。Google のクロール チームのソフトウェア エンジニアである Mehmet Aktuna は、「標準以外のエンコードを使用するのは、わざわざ災難を招いているようなものだ」と述べています。キー=値ペアには等号(=)を使用し、複数のパラメータの追加にはアンパサンド(&)を使用してください。example.com/category?category=gummy-candy&sort=low-to-high&sid=789
ワースト プラクティス:ワースト プラクティス 3: ユーザー生成値を、クロールもインデックス登録も可能だが、検索結果では有用でない(場合によっては無限の)URL パラメータに変換する。グッド プラクティス:example.com/c123/s789/product?swedish-fish
(/c123/ がカテゴリ、/s789/ がセッション ID だがページ コンテンツは変更されない)ベスト プラクティス:example.com/gummy-candy/product?item=swedish-fish&sid=789
(ディレクトリ /gummy-candy/ によってページ コンテンツが意味のある形で変更される)有用な値(たとえば「gummy-candy」)と有用でない値(たとえは「sessionID」)をパスに直接記述した場合、自動化されたプログラム(たとえば検索エンジン クローラ)がそれらを区別することは困難です。一方、URL パラメータを使用すれば検索エンジンにとって柔軟性が増し、クローラが各値のすべてのパターンにアクセスする必要があるかどうかを判断しやすくなります。example.com/product?item=swedish-fish&category=gummy-candy&sid=789
(URL パラメータにしたことで柔軟性が増し、検索エンジンが効率的にクロールできる)
ページ コンテンツを変更せず、URL パラメータとして設定されるべき一般的な値には次のものがあります:
- セッション ID
- トラッキング ID
- リファラー ID
- タイムスタンプ
ワースト プラクティス(例: 緯度/経度、「~日前」といったユーザーごとに変動する値を含む URL をクロールとインデックス登録の対象にする):ワースト プラクティス 4: URL パラメータの追加に論理性がないベスト プラクティス:
example.com/find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
example.com/article?category=health&days-ago=7
ユーザーごとに変動する値を含む URL をクロールするようにしても、処理が無限になる可能性があるだけで、検索ユーザーにとってはほとんど価値がありません。それよりも、最も一般的な値のカテゴリ ページを公開して追加情報を含めるようにすると、通常の検索結果ページより多くの付加価値を提供できます。ユーザー生成値を使用する場合は、生成値を別のディレクトリに格納し、robots.txt がそのディレクトリをクロールしないように設定します。
example.com/find-a-doctor?city=san-francisco&neighborhood=soma
example.com/articles?category=health&date=january-10-2014
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
User-agent: *
Disallow: /filtering/
ワースト プラクティス:ワースト プラクティス 5: 該当する検索結果のない絞り込み条件が表示されているベター プラクティス:
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
関連性の低い URL パラメータを追加しても、重複が増えてクロールやインデックス登録の効率が下がるだけです。URL を生成する前に、不要な URL パラメータを削除してサイト内を「整理整頓」しましょう。ユーザー セッションに必要なパラメータが多い場合は、example.com/product?item=swedish-fish&category=gummy-candy
cat=gummy-candy&cat=lollipops&cat=gummy-candy&
... のように次々と値を追加するのではなく、Cookie を使って情報を保持するようにします。
ワースト プラクティス:該当する商品が 1 つもない絞り込み条件が選択可能になっている。
ベスト プラクティス:ユーザーの選択が妥当な場合(つまり商品が存在するとき)にのみリンク/URL が生成されるようにします。該当する商品がないフィルタ条件はグレー表示されるようにします。使い勝手をさらに向上させるには、各フィルタ条件の横に該当する商品数を表示することも検討してください。
無用な 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
...
- オプション 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
)
- 悪い例
example.com/category.php?session-id=123&tracking-id=456&category=gummy-candies&taste=sour
- シリーズを構成する各ページに、カテゴリの「すべて表示」ページへの rel="canonical" を追加します(例: 「グミ」カテゴリの page=1、page=2、page=3 に
category=gummy-candies&page=all
への rel="canonical" を追加します)。その際に、検索ユーザーのエクスペリエンスを損なわない(各ページがすばやく読み込まれるなど)よう注意してください。 - rel="next" と rel="prev" でページ指定をマークアップして、リンクなどのインデックス登録のプロパティを構成ページ/URL からシリーズ全体に統合します。
サイトに既にファセット ナビゲーションが実装されている場合のベスト プラクティス
前のセクションで説明したベスト プラクティス(たとえば不要な URL の rel="nofollow")は、既存のサイトのファセット ナビゲーションを大幅に再設計する場合にも適用できます。ただし、既存のファセット ナビゲーションの場合は、検索エンジンが認識したクロール領域が既に大きくなっているケースが多いようです。したがって、Googlebot によりクロールされる不要なページを増やさないようにすることと、インデックス登録のシグナルの統合を検討することが重要になります。
- 可能な場合は、標準のエンコードとキー=値ペアによるパラメータを使用します。
- ページ コンテンツを変更しない値(セッション ID など)は、ディレクトリではなく標準のキー=値ペアとして実装されていることを確認します。
- 特定のカテゴリ/フィルタに商品が存在しない場合には、クリック可能なアンカーを使用しないようにします(つまり、フィルタを実行して該当するアイテムが見つからない場合には、クリックされたり、URL が生成されたりしないようにします)。
- URL パラメータが論理的に表示されるようにします。
- 値を次々と追加するのではなく、不要なパラメータを削除するようにします(例:
example.com/product?cat=gummy-candy&cat=lollipops&cat=gummy-candy&item=swedish-fish
のような 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
とします)。- シリーズを構成する各ページに、カテゴリの「すべて表示」ページへの rel="canonical" を追加します(例: 「グミ」カテゴリの page=1、page=2、page=3 に
category=gummy-candies&page=all
への rel="canonical" を追加します)。その際に、検索ユーザーのエクスペリエンスを損なわない(各ページがすばやく読み込まれるなど)よう注意してください。 - rel="next" と rel="prev" でページ指定をマークアップして、リンクなどのインデックス登録プロパティを構成ページ/URL からシリーズ全体に統合します。
シンプルなままにしておけるなら、それがベストであるということは覚えておいてください。ご不明な点がありましたら、ウェブマスター ヘルプ フォーラムまで質問をお寄せください。