AIクローラにとって、サイトマップは「このサイトにどんなページがあるか」を最短で把握するための地図です。 robots.txtでクロールを許可しても、クローラがすべてのページを自力で発見できるとは限りません。

AIクローラは従来の検索エンジンのクローラと比べてクロール頻度が低い傾向があります。 限られたクロール機会の中で重要なページを確実に読ませるために、サイトマップの最適化はGEO対策の実務的な優先事項です。

サイトマップの基本構造

XMLサイトマップの基本構造は以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/blog/geo-guide</loc>
    <lastmod>2025-07-15</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>
タグ必須意味
<loc>はいページのURL(絶対URL)
<lastmod>いいえ最終更新日(W3C Datetime形式)
<changefreq>いいえ更新頻度のヒント
<priority>いいえサイト内の相対的な重要度(0.0〜1.0)

<loc> だけが必須ですが、GEO対策の観点では <lastmod> の設定が特に重要です。

lastmodの正確さが鍵

AIクローラはクロール対象を効率的に選択するために <lastmod> を参照していると考えられます。

<!-- 正しい:実際にコンテンツが更新された日付 -->
<lastmod>2025-07-15</lastmod>

<!-- 誤り:サイトマップ生成のたびに現在日時を入れる -->
<lastmod>2025-08-08T09:00:00+09:00</lastmod>

中身が変わっていないのに lastmod を毎回更新すると、クローラはそのサイトの lastmod を信頼できない情報と判断します。 Googleは過去に、不正確な lastmod を設定しているサイトの lastmod を無視すると明言しています。

lastmod はW3C Datetime形式(2025-08-082025-08-08T09:00:00+09:00)で記述します。 CMSの「公開日」と「更新日」が分かれている場合は、「最後にコンテンツを更新した日」を使ってください。

changefreqとpriorityは無視されている

Googleは2023年に <changefreq><priority> を無視していることを公式に認めています。 AIクローラも同様に、これらの値に基づいてクロール頻度を変える可能性は低いです。

設定コストは小さいため記述しても問題ありませんが、priorityを全ページ1.0にするような設定は無意味です。

大規模サイトのサイトマップ分割

XMLサイトマップには1ファイルあたり最大50,000URL、50MBの制限があります。 数万ページを超えるサイトでは、サイトマップインデックスファイルで分割します。

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/sitemap-blog.xml</loc>
    <lastmod>2025-08-08</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap-products.xml</loc>
    <lastmod>2025-07-20</lastmod>
  </sitemap>
</sitemapindex>

コンテンツの種類ごとに分割すると、AIクローラがどのカテゴリを優先すべきか判断しやすくなります。 更新頻度の高いコンテンツとそうでないコンテンツを分けることで、クロール効率が上がります。

AIクローラ向けの工夫

不要なURLを除外する

サイトマップに含めるURLは、AIに読ませたいページだけに絞ります。

EXCLUDE_PATTERNS = [
    r"\?",           # クエリパラメータ付きURL
    r"/page/\d+",    # ページネーション
    r"/search",      # 検索結果
    r"/tag/",        # タグページ
]

URLの総数を減らすことで、クローラが重要なページに到達する確率が上がります。

重要ページを先頭に配置する

仕様上はURL順に優先度はありませんが、クローラが上から順にクロールする実装は多いです。 GEO対策の主要コンテンツを先頭に配置するのは実務的に有効です。

フレームワーク別のサイトマップ生成

Next.jsでの例

// app/sitemap.ts
import { MetadataRoute } from "next";

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const articles = await getArticles();
  const sorted = articles.sort(
    (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
  );
  return sorted.map((article) => ({
    url: `https://example.com/blog/${article.slug}`,
    lastModified: new Date(article.updatedAt),
  }));
}

Astroでの例

// astro.config.mjs
import { defineConfig } from "astro/config";
import sitemap from "@astrojs/sitemap";

export default defineConfig({
  site: "https://example.com",
  integrations: [
    sitemap({
      filter: (page) => {
        const exclude = ["/tag/", "/search", "/draft/"];
        return !exclude.some((p) => page.includes(p));
      },
    }),
  ],
});

サイトマップの検証

XMLの構文チェック

curl -s https://example.com/sitemap.xml | xmllint --noout -

URLの到達性チェック

import requests
import xml.etree.ElementTree as ET

def check_sitemap_urls(sitemap_url: str) -> None:
    ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
    response = requests.get(sitemap_url)
    root = ET.fromstring(response.content)
    errors = []
    for url_elem in root.findall("sm:url", ns):
        loc = url_elem.find("sm:loc", ns).text
        try:
            r = requests.head(loc, timeout=10, allow_redirects=True)
            if r.status_code != 200:
                errors.append({"url": loc, "status": r.status_code})
        except requests.RequestException as e:
            errors.append({"url": loc, "error": str(e)})
    print(f"問題のあるURL: {len(errors)}件" if errors else "すべて正常")

よくある問題

HTTPとHTTPSの混在。 サイトマップ内のURLはプロトコルを統一してください。

www有無の不一致。 canonicalで正規化しているURLと一致させます。

古いURLの残存。 削除したページのURLがサイトマップに残っていると、クロール効率が下がります。 404を返すURLは定期的に除去してください。

robots.txtとの連携

User-agent: *
Allow: /

Sitemap: https://example.com/sitemap-index.xml

サイトマップインデックスを使う場合は、インデックスファイルのURLだけを記述します。 AIクローラにはGoogle Search Consoleのような送信手段がないため、robots.txtでの指定がより重要です。

まとめ

サイトマップのGEO最適化は、AIクローラに「何を読んでほしいか」を明示する手段です。 lastmod の正確な設定、不要URLの除外、コンテンツ種別ごとの分割が、クロール効率を上げる具体策です。

robots.txtでクロールを許可し、サイトマップで重要ページへの道筋を示す。 この2つのファイルがGEO対策のインフラであり、コンテンツ改善の前に整備すべき基盤です。