Article

最新Googleアルゴリズム動向:コアアップデートへの備えと対策

高田晃太郎
最新Googleアルゴリズム動向:コアアップデートへの備えと対策

Google検索は一日に数十億件のクエリを処理し¹、コアアップデートは近年、年におよそ二〜四回の頻度で実施されています²。2024年3月にはCore Web Vitalsの評価軸が見直され、FIDに代わりINPが正式採用されました³。良好なINPの目安は200ms以下⁴。JavaScriptの長いタスクやUI応答の遅延は、これまで以上に体験評価(UX)と検索順位へ影響します。同月にはスパムポリシーも拡充され、スケール生成コンテンツの乱造、期限切れドメインの濫用、他サイトの評判を借りたホスティングなどへの取り締まりが強化されました⁵。結果として、コアアップデート直後にはSearch Consoleの週次クリックが大きく振れるケースは珍しくなく(更新展開中は変動が増えるとGoogleも告知)⁵、影響の振れ幅と回復速度の差は、サイトの技術的な基盤と運用設計の差として露わになります。開発とグロースの両面からの観測を重ねると結論は収束します。観測・検知・復旧・再発防止を、コードと運用で自動化できる組織だけが、アップデートを継続的な成長に変えやすい、ということです。

コアアップデートの現在地:何が評価され、何が退場するのか

コアアップデートは単一シグナルのON/OFFではなく、検索全体のランキングシステムの重み付け再編と捉えるべきです。2024年に統合が明言された“helpful content”は独立した仕組みからコアシステムの一部に取り込まれ⁵、ページ単位ではなくサイト全体の一貫性と実体性(作者や組織の信頼性、E-E-A-Tに相当)がより厳しく問われています。機械的に量産されたページ、言い換えだけの薄い記事、ユーザー行動データ上の満足度が低いテンプレートは、サイト全体の評価を引き下げやすくなりました。

リンクは依然として重要ですが、内容の独自性、一次情報性、専門実務の裏付けと比べ、相対的な優位を常に保つとは限りません。ビジネスやエンジニアリング領域なら、独自のベンチマーク、失敗から得た知見、操作ログやDB統計から導出した数値など、情報利得(Information Gain)を生む一次データが強く評価されます。逆に、評判の良いドメイン配下に話題性はあるが専門性に欠ける記事を大量掲載する手法は、2024年以降のポリシー下では「サイトの評判の濫用」と見なされるリスクが明確化しました⁵。

2024年の技術トピック:INPとレンダラビリティ

INPはユーザーの全体的なインタラクション応答性を測る指標で³、長いタスク、レイアウトスラッシング、メインスレッドの飽和に敏感です。SPA(単一ページアプリ)やSSR+CSR(サーバー描画とクライアント描画の併用)のハイブリッド構成では、サーバー側の初期描画を成立させつつ、クライアント移行時のJS初期化を最小化する設計がより重要です。JSバンドルの分割、ロード優先度の調整、非同期処理のスケジューリングはINPの支配要因になりやすいからです。レンダリング観点では、クローラビリティ(クロールされやすさ)と並び、レンダラビリティ(実際にユーザーが読める形で高速表示できるか)が実体評価の土台になります。単なるLCP(Largest Contentful Paint)改善だけでは足りません。

よく落ちるサイトの共通点と修復の着眼点

テンプレート単位の品質ばらつき、意図が薄いタグ・カテゴリ生成、クロールバジェットを消費する重複URL、著者・組織情報の不十分さは、まとめて評価低下のトリガーになります。修復では、検索ボリューム順に闇雲に記事をリライトするのではなく、テンプレート×意図(タスク)×デバイスで損失を帰属させるのが回復最短経路です。検索意図が明確なクエリ群で情報利得を最大化し、ハブページからの内部リンクで回遊と補完性を設計すると、コアアップデート後の再評価フェーズで反発が起きやすくなります。

観測と検知の自動化:GSC・GA4・ログを束ねる

アップデート対応で最初に整えるべきは、データの可用性です。Search Console APIでクエリ×ページ×デバイスのデータを日次で取得し⁷、BigQueryに正規化テーブルを構築してテンプレートや意図クラスタに紐づけます。GA4はランディングとスクロール・エンゲージメント、サーバーログはクロール頻度とステータス推移を補完します。そこに異常検知と原因帰属のロジックを置けば、コアアップデート当日の朝にダッシュボードが自動で「どのテンプレート・どの意図・どのデバイスがどれだけ落ちたか」を知らせます。

まずはGSCから毎日の検索パフォーマンスを取得し、BigQueryへ投入するパイプラインを用意します。Pythonと公式APIでの最小実装は次のとおりです⁷。

import datetime
from googleapiclient.discovery import build
from google.oauth2 import service_account
from google.api_core.exceptions import GoogleAPIError
from google.cloud import bigquery

SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']
KEY_PATH = 'svc_account.json'
SITE_URL = 'https://example.com/'
BQ_PROJECT = 'your-project'
BQ_DATASET = 'gsc'
BQ_TABLE = 'search_performance'

creds = service_account.Credentials.from_service_account_file(KEY_PATH, scopes=SCOPES)
webmasters = build('searchconsole', 'v1', credentials=creds)
bq_client = bigquery.Client(project=BQ_PROJECT)

def fetch_gsc_rows(start_date: str, end_date: str):
    body = {
        'startDate': start_date,
        'endDate': end_date,
        'dimensions': ['query', 'page', 'device', 'date'],
        'rowLimit': 25000
    }
    return webmasters.searchanalytics().query(siteUrl=SITE_URL, body=body).execute()

try:
    today = datetime.date.today()
    start = (today - datetime.timedelta(days=7)).isoformat()
    end = (today - datetime.timedelta(days=1)).isoformat()
    data = fetch_gsc_rows(start, end)
    rows_to_insert = []
    for row in data.get('rows', []):
        query, page, device, date = row['keys']
        rows_to_insert.append({
            'date': date,
            'query': query,
            'page': page,
            'device': device,
            'clicks': row.get('clicks', 0),
            'impressions': row.get('impressions', 0),
            'ctr': row.get('ctr', 0.0),
            'position': row.get('position', 0.0)
        })
    table_ref = bq_client.dataset(BQ_DATASET).table(BQ_TABLE)
    errors = bq_client.insert_rows_json(table_ref, rows_to_insert)
    if errors:
        raise RuntimeError(f'BQ insert errors: {errors}')
except (GoogleAPIError, RuntimeError) as e:
    print(f'Ingestion failed: {e}')

テンプレートや意図で集計し、週次の変化率が大きい箇所を早期に炙り出すには、BigQueryでウォッチするのが現実的です。以下はテンプレート単位の週次クリック変化を計算し、30%以上の落ち込みをフラグするクエリ例です。

WITH base AS (
  SELECT
    date,
    REGEXP_EXTRACT(page, r'^https?://[^/]+/([^/?#]+)') AS tpl,
    device,
    SUM(clicks) AS clicks
  FROM `your-project.gsc.search_performance`
  WHERE date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY) AND DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
  GROUP BY 1,2,3
), wk AS (
  SELECT
    FORMAT_DATE('%G-%V', date) AS iso_week,
    tpl,
    device,
    SUM(clicks) AS clicks
  FROM base
  GROUP BY 1,2,3
), diff AS (
  SELECT
    tpl,
    device,
    clicks AS clicks_curr,
    LAG(clicks) OVER(PARTITION BY tpl, device ORDER BY iso_week) AS clicks_prev,
    iso_week
  FROM wk
)
SELECT
  tpl,
  device,
  iso_week,
  clicks_curr,
  clicks_prev,
  SAFE_DIVIDE(clicks_curr - clicks_prev, clicks_prev) AS wow_rate,
  wow_rate < -0.3 AS alert
FROM diff
WHERE clicks_prev IS NOT NULL
ORDER BY wow_rate ASC

時間的な変化検知には、トレンドと季節性を考慮できるモデルが向きます。軽量な運用を好むなら、移動中央値とロバストZスコアだけでも十分に役立ちます。Pythonでの簡易実装は次のとおりです。

import numpy as np
import pandas as pd

def robust_zscores(series: pd.Series, window=7):
    med = series.rolling(window, center=True, min_periods=1).median()
    mad = (series - med).abs().rolling(window, center=True, min_periods=1).median()
    z = 0.6745 * (series - med) / mad.replace(0, np.nan)
    return z.fillna(0)

# df: columns=[date, clicks]
df['z'] = robust_zscores(df['clicks'], window=7)
df['anomaly'] = (df['z'] < -3)

体験指標はLighthouse CIで継続監視します⁶。INPは実ユーザーのCrUX(Chrome UX Report)で最終評価されますが、回帰検知にはラボ計測の基準線が必要です。Node.jsでの設定例を示します。

// lighthouse-ci.config.js
module.exports = {
  ci: {
    collect: {
      numberOfRuns: 3,
      url: ['https://example.com/'],
      settings: { formFactor: 'desktop', screenEmulation: { disabled: true } }
    },
    assert: {
      assertions: {
        'performance': ['error', { minScore: 0.9 }],
        'experimental-interaction-to-next-paint': ['warn', { maxNumericValue: 200 }]
      }
    },
    upload: { target: 'filesystem', outputDir: './lhci' }
  }
}

実ユーザーのINP傾向はCrUXで原点確認します。評価は75パーセンタイルで判定されるため⁴、アップデート前後の傾向差分を押さえます。

curl -s -X POST \
  'https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"origin":"https://example.com"}' | jq '.record.metrics.interaction_to_next_paint'

コンテンツと情報設計:情報利得の最大化と構造の健全化

アップデートに強いサイトは、読者のタスク完了に徹底的に最適化され、一次データを含む独自の知見で情報利得を生んでいます。エンジニア読者向けなら、単なる概念説明で終わらせず、再現可能なコード、計測条件、失敗例と回避策までを含めることで、同一クエリ空間に存在する他の文献との差分が明確になります。これはアルゴリズム以前に、ユーザーがリンクを選び、滞在し、シェアする行動に対して真っ直ぐ効きます。

サイト構造面では、ハブ&スポークのモデルで体系化し、ハブからスポークへの内部リンクを文脈で繋ぎます。リンクは単なる一覧ではなく、なぜ次にそれを読むべきかの理由を添え、相互参照で「補完関係」を明示します。重複や薄いページは機械的に量を維持するのではなく、統合・noindex・削除を使い分けて、クロールバジェットと評価ノイズを同時に削ります。著者・組織の実体性は構造化データで補強し、日付や更新履歴を明確化します。ArticleとPerson/Organizationのスキーマは、検索側の理解を助ける基礎体力です⁸。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "最新Googleアルゴリズム動向:コアアップデートへの備えと対策",
  "author": {"@type": "Person", "name": "高田晃太郎"},
  "publisher": {"@type": "Organization", "name": "TechLead Insights"},
  "datePublished": "2025-08-30",
  "dateModified": "2025-08-30",
  "mainEntityOfPage": {"@type": "WebPage", "@id": "https://example.com/article"}
}
</script>

2024年のスパムポリシー拡充を前提に、プログラムによる大規模生成は、人間のレビューと目的適合性のチェックを通過しない限り、長期的なリスクを孕みます⁵。生成の自動化が必要な場合でも、公開フローには検索意図の適合チェック、ファクト検証、重複検査、体験指標の確認までを含む承認ゲートを設けます。これは安全確保だけでなく、コンテンツ投資のROIを安定化させる品質管理でもあります。

復旧と再発防止:プロダクト開発にSEOを組み込む

コアアップデートで影響が出たとき、最初の72時間でやるべきことは、原因特定を急ぐあまり全体を改変するのではなく、影響の局所化と仮説検証の枠組みづくりです。テンプレート起因か、意図ミスマッチか、情報利得の不足か、体験劣化か、あるいはポリシー違反の疑いか。これらの仮説に対して、影響度と修正容易性の掛け合わせで優先度をつけます。プロダクト開発のスプリントにSEOタスクを恒常的に編成し、計測・改善・リリース・検証のループを噛み合わせると、アップデートの波を逐次の改善でいなせます。

技術的な回復策としては、テンプレートごとのコンテンツブロック再設計、FAQやHow-toなどの構造化、メインスレッド負荷を下げるJS最適化、画像の優先度とレイジーロードの見直し、内部リンクの文脈化強化などが効きます。サーチエンジン視点のクロール阻害要因をログで突き止め、ステータスコード、robots、レンダリングの三点で健康状態を可視化します。Cloud Run等での軽量なログ解析も有用です。

# 例:GCSに保存したnginxログをCloud Runで集計し、クローラの5xx増加を検知
import gzip
import re
from google.cloud import storage

BUCKET = 'logs-bucket'
PATTERN = re.compile(r'"(?P<ua>Googlebot|Google-InspectionTool)[^"]*" .* (?P<status>\d{3}) ')

def analyze_recent(prefix: str):
    client = storage.Client()
    bucket = client.bucket(BUCKET)
    blobs = list(bucket.list_blobs(prefix=prefix))
    status_counts = {}
    for b in blobs[-50:]:
        with b.open('rb') as f:
            data = gzip.decompress(f.read()).decode('utf-8', errors='ignore')
            for line in data.splitlines():
                m = PATTERN.search(line)
                if not m:
                    continue
                status = m.group('status')
                status_counts[status] = status_counts.get(status, 0) + 1
    return status_counts

if __name__ == '__main__':
    print(analyze_recent('nginx/2025/08/'))

リリース運用では、Lighthouse CIやE2Eテストと同列に検索観点の回帰をテストスイートへ取り込みます。GitHub Actionsでスモークを回し、閾値逸脱時はステータスチェックでブロックするだけでも、体験劣化の混入を抑制できます⁶。

name: SEO Guard
on: [push]
jobs:
  lhci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npx @lhci/cli autorun --config=./lighthouse-ci.config.js

最後に、意思決定のスピードを支えるのは、定量のダッシュボードと定性のレビュー会の両輪です。ダッシュボードは、クエリ群の意図ごとの獲得・損失、テンプレートごとの体験指標、クロール健全性を一枚に集約します。レビュー会では、実際の検索結果を開き、競合の情報利得、SERP機能の占有、ユーザーの次の行動を想像しながら、改善案を「ユーザーのタスク完了」に結び直します。検索の評価は相対戦であり、勝ち筋はプロダクトの価値と運用の規律の上にしか築けません。

まとめ:波を読む組織は、波を力に変える

アルゴリズムはブラックボックスではありますが、ユーザーの満足というホワイトボックスに収束します。2024年のINP採用とスパムポリシー強化は、「速く、役に立ち、実体があること」をいっそう強く求めました³⁴⁵。観測と検知を自動化し、テンプレート×意図で原因に辿りつき、情報利得と体験で差をつける。この営みをプロダクト開発のリズムに組み込み続ければ、アップデートのたびに右往左往する組織から、波を読んで波に乗る組織へと変わっていけます。次の四半期のスプリント計画に、検索観点のKPIと回帰テスト、そして一次データを生む記事企画をひとつだけでも追加してみませんか。小さな習慣の積み重ねが、次のコアアップデートでの静かな自信につながります。

参考文献

  1. Search Engine Land. Google processes more than 5 trillion searches per year.
  2. Search Engine Land. Google algorithm updates 2024.
  3. Google Search Central Blog. Introducing INP: A new responsiveness metric for a more delightful web.
  4. web.dev. Defining the Core Web Vitals metrics thresholds.
  5. Google Search Central Blog. March 2024 core update and new spam policies.
  6. web.dev. Lighthouse CI.
  7. Google Search Console API. searchanalytics.query method.
  8. Google Search Central. Article structured data.