はじめに

Digital Literary Map of Japan(日本のデジタル文学地図)の開発において、Google Search Console で「クロール済み - インデックス未登録」のページが391件報告されていました。Google がページをクロールしているにもかかわらず、インデックスに登録しないのはなぜでしょうか。

その対策の一つとして、schema.org 構造化データの導入を行いました。本記事では、構造化データとは何か、どのように実装したか、そしてどのような効果が期待できるかを解説します。

構造化データとは

Web ページには通常、HTML で書かれたコンテンツがあります。人間はそれを見て「これは場所の情報だ」「これは住所だ」と理解できますが、検索エンジンのクローラーにとっては、すべてが単なるテキストの羅列にすぎません。

構造化データは、ページのコンテンツが何を意味するのかを、機械可読な形式で検索エンジンに伝える仕組みです。schema.org という標準的な語彙を用い、JSON-LD(JSON for Linking Data)形式で HTML に埋め込みます。

たとえば、「明石」という文学名所のページを考えてみましょう。HTML だけでは、Google は「明石」が場所なのか、人名なのか、作品名なのかを確実に判断できません。構造化データを追加すると、「これは日本の兵庫県にある緯度34.64、経度134.99の場所で、歌枕として知られている」という情報を明示的に伝えられます。

JSON-LD の基本構造

構造化データは HTML の <script type="application/ld+json"> タグ内に記述します。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Place",
  "name": "明石",
  "alternateName": "Akashi",
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 34.649312,
    "longitude": 134.992637
  }
}
</script>

各プロパティの意味は以下のとおりです。

  • @context : 語彙の定義元です。常に https://schema.org を指定します
  • @type : データの種類です。PlaceWebSiteDataset など、schema.org で定義された型を指定します
  • その他のプロパティ : 型に応じた具体的な情報を記述します

実際に導入した構造化データの種類

1. Place(場所)- 文学名所の詳細ページ

文学名所の各ページ(約300件 × 日英2言語)に、Place 型の構造化データを追加しました。

{
  "@context": "https://schema.org",
  "@type": "Place",
  "name": "明石",
  "alternateName": "Akashi",
  "description": "旧国名: 播磨国 | 都道府県: 兵庫県 | 源氏物語の舞台として...",
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 34.649312,
    "longitude": 134.992637
  },
  "address": {
    "@type": "PostalAddress",
    "addressRegion": "兵庫県",
    "addressLocality": "播磨国",
    "addressCountry": "JP"
  },
  "keywords": "歌枕, 名所, 月, 浦, 須磨",
  "url": "https://literarymaps.nijl.ac.jp/spots/xxxx/"
}

必要なデータは以下のとおりです。

  • 場所の名前(漢字・ローマ字)
  • 緯度・経度
  • 住所情報(都道府県・旧国名)
  • 説明文
  • 関連するキーワード

2. WebSite(Webサイト)- トップページ

サイト全体の情報をトップページに記述します。

{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Digital Literary Map of Japan",
  "url": "https://literarymaps.nijl.ac.jp",
  "description": "歌枕・名所アノテーションツール",
  "inLanguage": ["ja", "en"],
  "publisher": {
    "@type": "Organization",
    "name": "Digital Literary Map of Japan",
    "url": "https://literarymaps.nijl.ac.jp",
    "logo": {
      "@type": "ImageObject",
      "url": "https://literarymaps.nijl.ac.jp/home.jpg"
    }
  }
}

3. BreadcrumbList(パンくずリスト)- 全ページ

ページ階層を Google に伝えます。検索結果にパンくずが表示されるようになります。

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "トップ",
      "item": "https://literarymaps.nijl.ac.jp/"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "文学名所",
      "item": "https://literarymaps.nijl.ac.jp/spots/"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "明石 / Akashi"
    }
  ]
}

4. Dataset(データセット)- データセットダウンロードページ

Google Dataset Search に登録されるための構造化データです。

{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "Digital Literary Map of Japan Dataset",
  "alternateName": "日本のデジタル文学地図 データセット",
  "description": "日本の文学名所に関する構造化データ...",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "creator": {
    "@type": "Organization",
    "name": "Digital Literary Map of Japan"
  },
  "distribution": [
    {
      "@type": "DataDownload",
      "contentUrl": "https://literarymaps.nijl.ac.jp/downloads/dlm-dataset.xlsx",
      "encodingFormat": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    }
  ]
}

Nuxt での実装方法

Nuxt(Vue.js ベースのフレームワーク)では、useHead コンポーザブルを使って各ページの <head> に構造化データを注入できます。本プロジェクトでは useSeo という共通コンポーザブルを作成し、各ページから呼び出す設計にしました。

// composables/useSeo.ts

const setPlaceJsonLd = (options: {
  name: string;
  alternateName?: string;
  latitude?: number;
  longitude?: number;
  addressRegion?: string;
}) => {
  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'Place',
    name: options.name,
    // ... その他のプロパティ
  };

  useHead({
    script: [
      {
        type: 'application/ld+json',
        innerHTML: JSON.stringify(jsonLd),
      },
    ],
  });
};

各ページでは以下のように呼び出します。

// pages/spots/[id]/index.vue

const { setPlaceJsonLd } = useSeo();

setPlaceJsonLd({
  name: attributes?.title || '',
  alternateName: attributes?.field_spot_name_romaji || '',
  latitude: attributes?.field_geo?.lat,
  longitude: attributes?.field_geo?.lon,
  addressRegion: attributes?.field_prefecture || '',
  addressLocality: attributes?.field_kuni || '',
  keywords: ['歌枕', '名所'],
});

SSG(静的サイト生成)のビルド時に各ページの HTML に構造化データが埋め込まれるため、JavaScript の実行を必要とせずにクローラーが読み取れます。

構造化データの検証

構造化データが正しく記述されているかは、以下のツールで検証できます。

構造化データで期待できる効果

1. インデックス登録率の改善

今回の主目的です。Google がページのコンテンツを「場所の情報」として正しく認識できるようになるため、「クロール済み - インデックス未登録」の件数が減少することが期待されます。構造化データはページの品質シグナルの一つとして機能します。

2. リッチリザルトの表示

検索結果に通常のタイトル・説明文だけでなく、パンくずリスト、地図情報、データセットのダウンロードリンクなどが追加で表示される可能性があります。

3. Google Dataset Search への掲載

Dataset 型の構造化データにより、Google Dataset Search にデータセットが掲載されます。研究者がデータを発見しやすくなります。

4. ナレッジグラフとの連携

Place 型の構造化データに含まれる緯度・経度や名称情報は、Google のナレッジグラフと紐づけられる可能性があります。歌枕や文学名所という文化的なコンテキストが Google の知識データベースに取り込まれることで、関連する検索クエリで表示されやすくなります。

構造化データ以外の Search Console 対策

構造化データの追加とあわせて、以下の技術的な対策も実施しました。

問題件数対策
ページにリダイレクトがあります614サイトマップ URL の trailing slash 統一
クロール済み - インデックス未登録391Place 構造化データの追加
見つかりませんでした(404)63.htaccess によるリダイレクト設定、エラーページの作成
検出 - インデックス未登録148robots.txt のサイトマップ URL 修正(旧ドメインのままだった)
重複系8canonical URL と og:locale:alternate の整備

これらは構造化データとは直接関係ありませんが、サイトの技術的な健全性を高めることで、Google のクロールとインデックスの効率を改善するものです。

まとめ

構造化データは、Web サイトのコンテンツを検索エンジンに「意味」として伝える手段です。特にデジタル・ヒューマニティーズのプロジェクトのように、場所・文献・データセットといった明確な構造を持つコンテンツには、schema.org の型(Place, Dataset, BreadcrumbList 等)が直接対応しており、導入の効果が高いと考えられます。

JSON-LD 形式は既存の HTML を変更せずに <script> タグを追加するだけで導入でき、Nuxt の useHead を使えばページごとに動的に生成できます。Google Search Console のインデックス問題に悩んでいる場合、構造化データの追加は検討に値する対策の一つです。