更新 Vertex AI Search 零售解决方案的本地商品目录

LocalInventory 是与特定地点关联的商品目录信息,由其 place_id 标识。例如,您可以为提供特定价格的商店或区域创建 LocalInventoryLocalInventory 具有以下字段:

  • LocalInventory.price_info
  • LocalInventory.attributes
  • LocalInventory.fulfillment_types

现有的 LocalInventory 条目可通过 Product.local_inventories 查看(fulfillment_types 除外,fulfillment_types 可通过 Product.fulfillment_info 获取,以实现向后兼容性)。此字段仅用于输出。为 Product CRUD API 或 SetInventory 设置 Product.local_inventories 没有任何影响。

每个 (LocalInventory.place_id, LocalInventory.fulfillment_types[...]) 对都指向目录更新文档中提及的相同 (fulfillment_info.place_ids, fulfillment_info.type) 对。由 AddLocalInventoriesRemoveLocalInventories(如下所述)更新的 fulfillment_types 反映了将每个地点 ID 映射到其支持的 fulfillment 类型列表的映射,而由 AddFulfillmentPlacesRemoveFulfillmentPlaces 更新的 fulfillment_info 反映了将每个具体 fulfillment 类型映射到支持此类型的地点 ID 列表的映射。不过,这两种 API 都会修改相同的底层执行信息,并且这两种 API 的影响都会反映在 Product.fulfillment_info 中。

本地商品目录更新方法

更改商品的本地商品目录信息的频率要比更改清单信息的频率高得多。我们提供了一套专门的方法来处理大量特定于本地商品目录的更新。这些方法是异步的,因为下游优化支持对每个商品同时执行数百个更新,而不会影响性能。

AddLocalInventories

AddLocalInventories 可用于在新地点(用新的 place_id 表示)创建本地商品目录,或更新现有本地商品目录中的现有字段。您可以通过 AddLocalInventoriesRequest.add_mask 指定在请求正文中的 LocalInventory 条目列表中添加或更新的字段。有效的 add_mask 值包括:

  • price_info:覆盖 LocalInventory.price_info
  • attributes:覆盖所有 LocalInventory.attributes。系统会移除请求正文中未提及的现有属性。
  • attributes.PLACEHOLDER_NAME:仅覆盖指定的自定义属性。如果请求中未提供现有属性名称,系统会删除该属性。可以指定多个 attributes.PLACEHOLDER_NAME,但每个属性名称必须不同。不过,AddLocalInventoriesRequest.add_mask 在同一请求中不能同时包含 attributes 值和 attributes.PLACEHOLDER_NAME 值。
  • fulfillment_types:覆盖所有受支持的执行方式类型。请求正文中未提及的现有执行方式类型将被移除。

Proto

{
  product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123"
  local_inventories: {
    place_id: "store1"
    price_info: {
      currency_code: "USD"
      price: 100
      original_price: 110
      cost: 95
    }
    fulfillment_types: "pickup-in-store"
    fulfillment_types: "ship-to-store"
  }
  local_inventories: {
    place_id: "store2"
    price_info: {
      currency_code: "USD"
      price: 200
      original_price: 210
      cost: 195
    }
    attributes: {
      key: "attr1",
      value: {
        text: "store2_value"
      }
    }
    fulfillment_types: "custom-type-1"
  }
  add_mask: {
    paths: "price_info"
    paths: "attributes.attr1"
    paths: "fulfillment_types"
  }
  add_time: {
    seconds: 100
    nanos: 100
  }
  allow_missing: true
}
  

此示例 AddLocalInventoriesRequest 会为指定商品添加或更新两个具有放置 ID "store1""store2" 的本地商品目录。如果在请求之前 store1 存在,而 store2 不存在,则请求会更新 store1 的字段,并使用给定的字段值创建 store2

AddLocalInventoriesRequest.add_mask 指定应使用 AddLocalInventoriesRequest.local_inventories 中提供的值更新 price_info(一个名为 "attr1" 的单个自定义属性)和 fulfillment_types

attributes 是与地点相关联的属性,具有可自定义的名称和值。由于 store1LocalInventory 未在请求中提供 attr1 的值,因此系统会从 store1 的现有 LocalInventory(如果存在)中删除自定义属性 attr1store2 的属性 attr1 的值将设置为文本值 store2_valuestore1store2 上的其他现有自定义属性保持不变。

fulfillment_types 表示单个地点的 Product 履单服务可用性列表。它与 fulfillment_info.type 相同,并接受与 fulfillment_info.type 相同的值。此 AddLocalInventoriesRequest 指定 store1 支持 pickup-in-storeship-to-store 执行方式,而 store1 支持 custom-type-1。在此更新之前存在但未在请求中提及的履单类型将被删除。

由于 AddLocalInventoriesRequest.allow_missing 设置为 true,因此即使商品尚不存在,系统也会存储更新后的本地商品目录信息,以供最终创建商品时使用。更新带有 AddLocalInventoriesRequest.add_time 时间戳,以防止过时更新覆盖这些地点 ID 的指定字段。如需详细了解如何在商品创建之前防止更新过时以及存储本地商品目录信息,请参阅针对本地商品目录更新的时间戳保护措施预加载商品目录信息

Proto

{
  product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123"
  local_inventories: {
    place_id: "store3"
    attributes: {
      key: "attr1",
      value: {
        text: "attr1_value"
      }
    }
    attributes: {
      key: "attr2",
      value: {
        numbers: 123
      }
    }
  }
  add_mask: {
    paths: "attributes"
  }
  add_time: {
    seconds: 100
    nanos: 100
  }
}
  

此示例 AddLocalInventoriesRequest 会为指定商品添加或更新一个地点 ID 为 "store3" 的本地商品目录。由于其 add_mask 包含 "attributes",因此 store3 的所有现有自定义属性都会被删除,并替换为请求中指定的 attr1attr2。请注意,由于未设置 allow_missing,因此需要指定的商品存在。否则,系统会抛出 NOT_FOUND 错误。

RemoveLocalInventories

RemoveLocalInventories 可用于移除具有给定地点 ID 的地点的现有本地商品目录。

Proto

{
  product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123"
  place_ids: "store1"
  place_ids: "store2"
  remove_time: {
    seconds: 100
    nanos: 100
  }
  allow_missing: true
}
  

此示例 RemoveLocalInventoriesRequest 会移除指定商品的放置 ID 为 "store1""store2" 的放置点的本地商品目录。更新带有 RemoveLocalInventoriesRequest.remove_time 时间戳,以防止过时更新覆盖这些地点 ID 的删除操作。对于没有现有本地商品目录的指定地点 ID,该请求还会将其更新时间记录为 remove_time。如需详细了解更新时间戳,请参阅本地商品目录更新的时间戳保护措施

本地商品目录更新的时间戳保护措施

为了防止出现无序更新,每个本地商品目录字段都与最新的更新时间相关联。

系统会记录每个 (place_id, price_info)(place_id, attributes[...])(place_id, fulfillment_types[...]) 对的最新更新时间。

调用 AddLocalInventoriesRemoveLocalInventories 方法可让调用方指定请求发出的更新时间。系统会将此更新时间与为相关商品目录字段记录的最新更新时间进行比较;当更新时间完全晚于最新更新时间时,才会提交更新。

例如,假设地点 ID "store1" 具有 price_info,并且上次记录的更新时间设置为 T。如果 RemoveLocalInventoriesRequest.place_ids 包含 "store1",则只有当 RemoveLocalInventoriesRequest.remove_time 晚于 T 时,请求才会从 "store1" 中移除 price_infoRemoveLocalInventoriesRequest 也是如此。

在时间戳保护下,RemoveLocalInventoriesRequest 可能会仅移除 LocalInventory 的某些字段,而不是全部字段。假设地点 ID 为 "store1" 的本地商品目录包含 price_info,其上次记录的更新时间设置为 T1,并且其唯一现有自定义属性的名称为 "attr1",上次记录的更新时间为 T2。如果 RemoveLocalInventoriesRequest.place_ids 包含 "store1",并且 remove_time 已设为 T3(其中 T1 < T3 < T2),则 store_1price_info 将被移除,而其属性 attr1 将保持不变。

预加载商品目录信息

每种本地商品目录更新方法都允许调用者在请求中设置 allow_missing。将 allow_missing 设置为 true 时,将按照方法规范处理对不存在的 Product 的本地商品目录更新,就像存在 Product 一样。如果未在此时间范围内通过 CreateProduct 创建相应的 Product,则本地商品目录信息将最多保留两天。