はじめに
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: データの種類です。Place、WebSite、Datasetなど、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 の実行を必要とせずにクローラーが読み取れます。
構造化データの検証
構造化データが正しく記述されているかは、以下のツールで検証できます。
- Google リッチリザルトテスト : Google が認識できるかを確認します
- Schema.org Validator : schema.org 仕様への準拠を確認します
- Google Search Console の「拡張」セクション : 実際のインデックス状況を確認します
構造化データで期待できる効果
1. インデックス登録率の改善
今回の主目的です。Google がページのコンテンツを「場所の情報」として正しく認識できるようになるため、「クロール済み - インデックス未登録」の件数が減少することが期待されます。構造化データはページの品質シグナルの一つとして機能します。
2. リッチリザルトの表示
検索結果に通常のタイトル・説明文だけでなく、パンくずリスト、地図情報、データセットのダウンロードリンクなどが追加で表示される可能性があります。
3. Google Dataset Search への掲載
Dataset 型の構造化データにより、Google Dataset Search にデータセットが掲載されます。研究者がデータを発見しやすくなります。
4. ナレッジグラフとの連携
Place 型の構造化データに含まれる緯度・経度や名称情報は、Google のナレッジグラフと紐づけられる可能性があります。歌枕や文学名所という文化的なコンテキストが Google の知識データベースに取り込まれることで、関連する検索クエリで表示されやすくなります。
構造化データ以外の Search Console 対策
構造化データの追加とあわせて、以下の技術的な対策も実施しました。
| 問題 | 件数 | 対策 |
|---|---|---|
| ページにリダイレクトがあります | 614 | サイトマップ URL の trailing slash 統一 |
| クロール済み - インデックス未登録 | 391 | Place 構造化データの追加 |
| 見つかりませんでした(404) | 63 | .htaccess によるリダイレクト設定、エラーページの作成 |
| 検出 - インデックス未登録 | 148 | robots.txt のサイトマップ URL 修正(旧ドメインのままだった) |
| 重複系 | 8 | canonical URL と og:locale:alternate の整備 |
これらは構造化データとは直接関係ありませんが、サイトの技術的な健全性を高めることで、Google のクロールとインデックスの効率を改善するものです。
まとめ
構造化データは、Web サイトのコンテンツを検索エンジンに「意味」として伝える手段です。特にデジタル・ヒューマニティーズのプロジェクトのように、場所・文献・データセットといった明確な構造を持つコンテンツには、schema.org の型(Place, Dataset, BreadcrumbList 等)が直接対応しており、導入の効果が高いと考えられます。
JSON-LD 形式は既存の HTML を変更せずに <script> タグを追加するだけで導入でき、Nuxt の useHead を使えばページごとに動的に生成できます。Google Search Console のインデックス問題に悩んでいる場合、構造化データの追加は検討に値する対策の一つです。