更新 Vertex AI Search for Commerce 的本地商品目录

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) 对。fulfillment_typesAddLocalInventoriesRemoveLocalInventories 更新,反映了从每个地点 ID 到其支持的 fulfillment 类型列表的映射;而 fulfillment_infoAddFulfillmentPlacesRemoveFulfillmentPlaces 更新,反映了从每个特定 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 的值,因此如果现有 store1LocalInventory 中存在自定义属性 attr1,则会将其删除。store2 的属性 attr1 的值将设置为文本值 store2_valuestore1store2 上的其他现有自定义属性保持不变。

fulfillment_types 表示单个地点的 Product 的履单可用性列表。它与 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,则本地商品目录信息将最多保留两天。