バッチフィードでは、エンティティのバージョンは、フィードのエンベロープ内の 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_time
とdelete_time
を明示的に使用します。 update_time
、delete_time
、dateModified
は、ローカル側でデータが変更されるタイミングに設定します。