批量 Feed 中的 v1 版本控制

在批量 Feed 中,实体的版本通过 Feed 封装容器中的 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 字段中列出的所有实体都将具有相同的时间戳,如封信中所列。

例如,您可以使用以下包含两个实体的 Feed:

{
  "@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 收到了以下增量调用,用于添加一家全新的餐厅。以下是 ID 为“http://www.provider.com/somerestaurant”的实体的 HTTP POST 请求,假设数据 Feed 使用 v1 商品目录架构:

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:00,而不是收到时(10 秒后的 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"
  },
  "update_time":"2018-12-28T06:30:00:123-07:00"
}

示例 2:隐式设置 update_time

假设在 2018-12-28T06:30:10:123-07:00 收到了以下增量调用,用于添加一家全新的餐厅。以下是 ID 为“http://www.provider.com/somerestaurant”的实体的 HTTP POST 请求,假设 Feed 使用 v1 商品目录架构:

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_timedateModified 字段。
  • 如果批量 Feed(文件)列出了多个顶级实体(例如,您将餐厅与服务和菜单相关联),请在实体数据更新时更新时间戳。
  • 在增量调用中,我们强烈建议您明确设置 update_time 字段。
  • 必须在发出增量调用后,在 Google 再次提取 Feed 之前更新相应的 Feed 时间戳 (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”。由于批量 Feed 需要时间进行处理,因此通常会在 2 天后投放。

不过,在下午 1 点,合作伙伴的系统更新了餐厅的电话号码,这会导致 Google 在 13:05(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”。

系统进行了增量调用,因此批量 Feed 会使用新的相应时间戳进行更新。此外,系统还会将相应更改应用于相关实体(餐厅实体的电话号码会更新)。

{
  "@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 点再次提取 Feed。餐厅仍使用相同的版本(12 月 28 日下午 1 点),因此系统会舍弃此实体,并保留当前版本。不过,系统会使用新版本更新“菜单”和“服务”实体。

站点地图时间戳

网站地图中的 last-modified 响应标头不会影响实体的版本。它会影响 Google 提取 Feed 的时间

最佳做法

  • 仅当所有文件均为最新版本且可以提取时,才更新响应标头。
  • 在增量更新中明确使用 update_timedelete_time
  • update_timedelete_timedateModified 设置为您这边的数据发生变化的时间。