バッチフィードでの v1 バージョニング

バッチフィードでは、エンティティのバージョンは、フィードのエンベロープ内の dateModified フィールドによって決まります。

{
  "@context": "http://schema.googleapis.com",
  "dateModified": "2018-12-28T06:30:00:123-07:00",
  "@type": "DataFeed",
  "dataFeedElement": [
    /* All the items that are part of this feed go here */
  ]
}

dataFeedElement フィールドにリストされているすべてのエンティティには、エンベロープにリストされているものと同じタイムスタンプが付与されます。

たとえば、2 つのエンティティを含む次のようなフィードがあります。

{
  "@context": "http://schema.googleapis.com",
  "@type": "DataFeed",
  "dateModified": "2018-12-28T06:30:00:123-07:00",
  "dataFeedElement": [
    {
      "@type": "Restaurant",
      "@id": "http://www.provider.com/somerestaurant",
      ...
    },
    {
      "@type": "Menu",
      "@id": "http://www.provider.com/somerestaurant/menu/1"
      ...
    }
  ]
}

メニューとレストランのエンティティは、受信して処理されると、個別に「2018-12-28T06:30:00:123-07:00」というバージョンが付けられます。

増分アップデートによるバージョニング

在庫の更新を使用してエンティティを送信する場合、バージョンは update_time フィールド(追加/更新呼び出しの場合)または delete_time フィールド(削除呼び出しの場合)で設定されます。これらのフィールドは省略可能であるため、デフォルトのタイムスタンプは Google が呼び出しを受信した時点に設定されます。

例 1: update_time が明示的に設定されている

まったく新しいレストランについて、2018-12-28T06:30:10:123-07:00 に次の増分呼び出しが受信されたとします。データフィードで v1 在庫スキーマが使用されていると仮定すると、ID が「http://www.provider.com/somerestaurant」のエンティティの HTTP POST リクエストは次のようになります。

POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json

以下では、JSON ペイロードの本文に update_time フィールドが含まれています。ID が「http://www.provider.com/somerestaurant」のエンティティは、受信時(10 秒後の 6:30:10)ではなく、6:30:00 としてバージョニングされます。

{
// This envelope is to be used for incremental.
  "entity": {
    // Note: "data" is not serialized as a string in our example for readability.
    "data": "[entity in JSON format serialized as a string]",
    "vertical": "FOODORDERING"
  },
  "update_time":"2018-12-28T06:30:00:123-07:00"
}

例 2: update_time が暗黙的に設定される

まったく新しいレストランについて、2018-12-28T06:30:10:123-07:00 に次の増分呼び出しが受信されたとします。フィードで v1 在庫スキーマを使用していると仮定した場合、ID が「http://www.provider.com/somerestaurant」のエンティティの HTTP POST リクエストは次のようになります。

POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json

以下では、JSON ペイロード本文に update_time フィールドが含まれていません。したがって、ID が「http://www.provider.com/somerestaurant」のエンティティは、6:30:10 としてバージョニングされます。

{
// This envelope is to be used for incremental.
  "entity": {
    //Note: "data" is not serialized as a string in our example for readability.
    "data": "[entity in JSON format serialized as a string]",
    "vertical": "FOODORDERING"
  }
}

バッチと増分のバージニング

Google に送信されたエンティティは、最新バージョンである場合にのみ処理され、配信されます。なお、バッチで送信されたエンティティは通常、処理に数日かかるのに対し、増分 API で送信されたエンティティはすぐに処理されます。

ベスト プラクティス

  • エンティティがシステムで変更されたタイミングに応じて、増分とバッチで update_time フィールドと dateModified フィールドをそれぞれ設定します。
  • バッチフィード(ファイル)に複数のトップレベル エンティティがリストされている場合(レストランをサービスやメニューとペア設定している場合など)、エンティティのデータが更新されるたびにタイムスタンプを更新します。
  • 増分呼び出しでは、update_time フィールドを明示的に設定することを強くおすすめします。
  • 増分呼び出しが行われた後は、Google がフィードを再度取得する前に、対応するフィードのタイムスタンプ(dateModified)も更新する必要があります。

Google は、2018 年 12 月 28 日午前 11 時に、まったく新しいレストランの次のファイルを取得します。

{
  "@context": "http://schema.googleapis.com",
  "@type": "DataFeed",
  "dateModified": "2018-12-28T06:30:00-07:00",
  "dataFeedElement": [
    {
      "@type": "Restaurant",
      "@id": "http://www.provider.com/newrestaurant",
      ...
    },
    {
      "@type": "Menu",
      "@id": "http://www.provider.com/newrestaurant/menu/1"
      ...
    }
    {
      "@type": "Service",
      "@id": "http://www.provider.com/newrestaurant/service/1"
      ...
    }
  ]
}

これらのエンティティは正常に処理され、「2018-12-28T06:30:00-07:00」というバージョンが付けられます。バッチフィードは処理に時間がかかるため、通常は 2 日後に配信されます。

しかし、午後 1 時にレストランの電話番号がパートナーのシステムで更新され、Google は 13 時 5 分(5 秒後)に次の増分呼び出しを受信します。

POST v2/apps/provider-project/entities/http%3A%2F%2Fwww.provider.com%2Fnewrestaurant:push
Host: actions.googleapis.com
Content-Type: application/ld+json
{
// This envelope is to be used for incremental.
  "entity": {
    //Note: "data" is not serialized as a string in our example for readability.
    "data": "[entity in JSON format serialized as a string]",
    "vertical": "FOODORDERING"
  },
  "update_time":"2018-12-28T13:00:00-07:00"
}

update_time は明示的に指定されており、以前のバージョン(同じ日の午前 6 時 30 分)よりも大きい(新しい)ため、レストラン エンティティのバージョンは「2018-12-28T13:00:00-07:00」になります。ただし、メニューとサービス エンティティは引き続き「2018-12-28T06:30:00-07:00」というバージョンになります。

増分呼び出しがあったため、バッチフィードは新しい対応するタイムスタンプで更新されます。また、対応する変更が関連エンティティに適用されます(レストラン エンティティの電話番号が更新されます)。

{
  "@context": "http://schema.googleapis.com",
  "@type": "DataFeed",
  "dateModified": "2018-12-28T13:00:00-07:00",
  "dataFeedElement": [
    {
      "@type": "Restaurant",
      "@id": "http://www.provider.com/newrestaurant",
      ...
    },
    {
      "@type": "Menu",
      "@id": "http://www.provider.com/newrestaurant/menu/1"
      ...
    }
    {
      "@type": "Service",
      "@id": "http://www.provider.com/newrestaurant/service/1"
      ...
    }
  ]
}

翌日(2018 年 12 月 29 日)午後 11 時に、フィードが再度取得されます。レストランのバージョンは引き続き同じ(12 月 28 日午後 1 時)であるため、このエンティティは破棄され、現在のバージョンが保持されます。ただし、Menu エンティティと Service エンティティは新しいバージョンで更新されます。

サイトマップのタイムスタンプ

サイトマップの last-modified レスポンス ヘッダーは、エンティティのバージョンには影響しません。これは、Google がフィードを取得するタイミングに影響します。

ベスト プラクティス

  • すべてのファイルが最新の状態になり、フェッチの準備ができた場合にのみ、レスポンス ヘッダーを更新します。
  • 増分処理で update_timedelete_time を明示的に使用します。
  • update_timedelete_timedateModified は、ローカル側でデータが変更されるタイミングに設定します。