このページでは、Retail API を使用して、Vertex AI Search for Commerce カタログのリアルタイムの価格と数量の更新を管理する方法について説明します。
Product の作成、読み取り、更新、削除(CRUD)メソッドは Product の属性の広範な変更に使用されますが、在庫に固有のフィールドをさまざまな粒度で更新するために使用する一連の Product メソッドもあります。
インベントリについて
一般的に、在庫とは、e コマース サイトの商品アイテムの在庫数(数量)と価格を指します。Retail API の場合、inventory は価格、在庫状況、在庫数、配送情報、ローカル価格、追加のローカル属性を指します。これらのフィールドは、次のフィールドを含む Product スキーマで定義されています。
Product.availabilityProduct.availableQuantityProduct.priceInfoProduct.fulfillmentInfoProduct.localInventories
商品レベルの在庫
オンライン カタログのみを持つ e コマース サイトの販売者の場合、通常、inventory はカタログ内の商品のみを表します。価格、在庫状況、その他のすべてのデータは、カタログの各商品エントリで設定されます。fulfillmentInfo フィールドと localInventories フィールドは使用されません。
ローカル在庫
複数の店舗を持つ販売者の場合、商品はカタログ内の商品エントリで表されますが、addLocalInventories メソッドを使用して、商品の店舗(placeId)にローカル在庫(価格、在庫状況、配送)を追加できます。
ローカル在庫に使用される商品フィールドは、Product.fulfillmentInfo と Product.localInventories の 2 つに分かれています。要件に応じて、一方または両方を使用できます。fulfillmentInfo と localInventories はどちらも、関連データを含む場所のリストです。
fulfillmentInfo は特定の商品が特定の店舗でどのように販売されるかを指定し、localInventories は各店舗の価格やその他のカスタム属性を指定します。
特定の商品を在庫切れまたは特定の店舗で取り扱いがなくなったとマークするには、removeLocalInventories メソッドを使用して、特定の商品について fulfillment と inventory を削除します。placeId
広告枠更新メソッド
商品の在庫情報の変更は、カタログ情報の変更よりも頻繁に発生する可能性があります。そのため、在庫固有の更新を大量に処理するための特別な一連のメソッドが提供されます。これらのメソッドは、パフォーマンスを犠牲にすることなく、商品ごとに数百の同時更新をサポートするダウンストリームの最適化のために、非同期になっています。
増分更新
ローカル在庫の更新ガイドに沿って、在庫の増分更新を行います。新しい API メソッドは、場所ごとの在庫属性をよりきめ細かく制御できます。
fulfillment_info は、Product に対する場所レベルのフルフィルメントの可用性をエンコードするためによく使用されます。場合によっては、特定の場所のフルフィルメントの可用性が変わることがあります。UpdateProduct メソッドを使用して商品全体のフルフィルメント情報を再指定する代わりに、この変更を説明する更新を発行することを決定できます。
そのような場合、AddFulfillmentPlaces メソッドと RemoveFulfillmentPlaces メソッドを使用して、特定のフルフィルメント タイプに対して追加または削除される場所 ID に基づいて商品のフルフィルメントの変更を段階的に更新できます。
Java
Vertex AI Search for Commerce のクライアント ライブラリをインストールして使用する方法については、Vertex AI Search for Commerce クライアント ライブラリをご覧ください。詳細については、Vertex AI Search for Commerce の Java API リファレンス ドキュメントをご覧ください。
Vertex AI Search for Commerce に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
.proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" type: "pickup-in-store" place_ids: "store0" place_ids: "store1" add_time: { seconds: 100 nanos: 100 } allow_missing: true }
このサンプル AddFulfillmentPlacesRequest では、特定の商品の場所 ID "store0" と "store1" にフルフィルメント タイプ "pickup-in-store" を追加します。AddFulfillmentPlacesRequest.allow_missing は true に設定されているため、商品がまだ存在しない場合でも、最終的に商品が作成されたときに更新された在庫情報が保存されます。更新には、AddFulfillmentPlacesRequest.add_time というタイムスタンプが付けられており、これらの場所 ID のフルフィルメント ステータスが古い更新によってオーバーライドされないようにしています。これらの機能については、次のセクションで詳しく説明します。
この動作は RemoveFulfillmentPlacesRequest とほぼ同じであり、スキーマもよく似ています。
fulfillment_types が AddLocalInventories と RemoveLocalInventories によって更新されると、それぞれの場所 ID からサポートするフルフィルメント タイプのリストへのマッピングが反映されます。fulfillment_info が AddFulfillmentPlaces と RemoveFulfillmentPlaces で更新されると、それぞれの特定のフルフィルメント タイプから各タイプをサポートする場所 ID のリストへのマッピングが反映されます。どちらの API タイプでも同じ基盤となるフルフィルメント情報が変更され、両方のタイプの API の効果は Product.fulfillment_info に反映されます。
非増分更新
price_info、availability、available_quantity の各メソッドは、場所レベルの情報ではなく、商品レベルの在庫を表すため、増分更新できません。また、非増分アップデートを fulfillment_info に発行することもおすすめします。増分の変更のみではなく、SetInventory をおすすめします。
setInventory メソッドは、頻繁な更新が多数必要な場合に、商品単位で価格、在庫状況、数量を更新するのに適した方法です。setInventory メソッドは非同期であるため、更新がすぐに反映されないことがあります。デフォルトの割り当て(1 分あたり 300,000 件のリクエスト)は、UpdateProduct よりもはるかに多くのリクエストをサポートします。
また、fulfillmentInfo がリクエストに含まれている場合、setInventory メソッドはローカル フルフィルメントの更新に使用されますが、localInventories フィールドを更新することはできません。これらの属性には、addLocalInventories メソッドと removeLocalInventories メソッドを使用します。
ローカル在庫はカタログとは別に店舗単位で保存されます。オンラインとオフラインの両方の在庫がある場合は、メインの商品カタログをオンラインで使用するか、特定の placeId(-1 や online など)を使用してオンライン在庫を表すことができます。ただし、商品在庫フィールドには有効な priceInfo 値と availability 値が入力されている必要があるため、オンライン商品在庫にはメイン カタログを使用します。オンライン用に別の在庫 placeId を使用している場合は、メイン カタログの価格と在庫状況の情報も最新の状態に保つ必要があります。ローカル在庫の更新について詳しくは、ローカル在庫を更新するをご覧ください。
Java
Vertex AI Search for Commerce のクライアント ライブラリをインストールして使用する方法については、Vertex AI Search for Commerce クライアント ライブラリをご覧ください。詳細については、Vertex AI Search for Commerce の Java API リファレンス ドキュメントをご覧ください。
Vertex AI Search for Commerce に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
.proto
{ product: { name: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" availability: IN_STOCK fulfillment_info: { type: "pickup-in-store" place_ids: "store0" place_ids: "store1" place_ids: "store2" place_ids: "store3" } fulfillment_info: { type: "same-day-delivery" } } set_time: { seconds: 100 nanos: 100 } set_mask: { paths: "availability" paths: "fulfillment_info" } allow_missing: true }
このリクエストでは、増分仕様とは異なり、SetInventoryRequest.product.fulfillment_info フィールドが各フルフィルメント タイプの有効な場所 ID の完全な説明です。"same-day-delivery" への更新は、この商品のこのフルフィルメント タイプの対象となる場所 ID がないことを示します。他のすべてのフルフィルメント タイプは、このリクエストで更新されません。したがって、このメソッドを使用して、フルフィルメント タイプのサブセットのみの場所 ID を置換し、他のタイプはそのままにすることができます。
デフォルトでは、SetInventory は SetInventory.set_mask が未設定または空の場合にすべての在庫フィールドを更新します。マスクが空でない場合、または在庫フィールドが SetInventoryRequest.set_mask に明示的に一覧表示されていない場合、その在庫フィールドの指定された値は更新リクエストで無視されます。
増分更新と同様に、SetInventoryRequest.set_time フィールドを使用して、すべての更新済み在庫フィールドで最後に記録された更新時間に対して更新時間を設定できます。
在庫更新のためのタイムスタンプの保護
商品の在庫フィールドを更新したり、順不同な更新から保護したりするためのいくつかのパスがあり、各在庫フィールドが最新の更新時間に関連付けられます。
最新の更新時間が price_info、availability、available_quantity、(fulfillment_info.place_ids,
fulfillment_info.type) の各ペアに対して記録されます。
AddFulfillmentPlaces メソッド、RemoveFulfillmentPlaces メソッド、SetInventory メソッドを使用すると、リクエストの発行時に、呼び出し元が更新時刻を指定できます。この更新時刻が、関連する在庫フィールドに対して記録された最新の更新時刻と比較され、更新時刻が直近の更新時刻より後の場合に限り、更新がコミットされます。
たとえば、場所 ID "store1" でフルフィルメント タイプ "pickup-in-
store" が有効で、最後に記録された更新時刻が T に設定されているとします。RemoveFulfillmentPlacesRequest.type = "pickup-in-store" と RemoveFulfillmentPlacesRequest.place_ids が "store1" を含む場合、RemoveFulfillmentPlacesRequest.remove_time がT より後の場合に限り、リクエストにより "pickup-in-store" が "store1" から消去されます。AddFulfillmentPlacesRequests の場合も同様です。
price_info、availability、available_quantity の更新についても、SetInventory は同様に動作します。fulfillment_info の更新時に、SetInventoryRequest は特定のフルフィルメント タイプに指定されたすべての場所 ID を追加し、指定されていない既存の場所 ID をすべて削除するよう暗黙的に要求します。
SetInventoryRequest が処理されると、fulfillment_info の更新によって、指定されたフルフィルメント タイプごとに AddFulfillmentPlacesRequest と RemoveFulfillmentPlacesRequest に暗黙的に変換されます。つまり、フルフィルメント "pickup-in-store" がある既存の場所 "store1" の最終更新時刻 T が SetInventoryRequest.set_time よりも新しい場合、"store1" と "pickup-in-store" での暗黙の追加または削除は適用されません。
プリロード属性
setInventory は非同期です。つまり、インベントリ フィールドの追加や変更時に分類学的制御や参照制御は適用されません。このメソッドでは、リクエストで参照されるプロダクトがすでに存在している必要はありません。
これにより、お客様はプリローディング パターンを実装できます。このパターンでは、在庫フィールドの管理をメイン カタログまたは商品インポート プロセスから切り離すことができます。たとえば、関連する商品がインポートされる前に、ユーザーは在庫状況や価格のコンテキストをインポートできます。
各在庫更新メソッドでは、呼び出し元がリクエストで allow_missing を設定できます。allow_missing が true に設定されている場合、存在しない Product への在庫の更新は、メソッドの仕様に従って Product が存在しているかのように処理されます。この期間内に対応する Product が CreateProduct を使用して作成されない場合、在庫情報は最大 2 日間保持されます。
Java
Product メソッドを使用するタイミング
商品の CRUD メソッドを使って在庫フィールドを更新することは可能ですが、呼び出し元は既存の在庫情報または既存の在庫情報への影響に注意する必要があります。
これらは同期メソッドであり、在庫メソッドで使用されるダウンストリームの最適化は適用されないため、頻繁に在庫を更新する場合にこれらのメソッドに依存すると、コストが膨大になる可能性があります。可能であれば、前述の在庫の更新メソッドを使用してください。
CreateProduct
在庫フィールドを設定して CreateProduct を呼び出す場合、CreateProductRequest.product で指定された値によって、各フィールドのプリロード済みの値がオーバーライドされます。在庫フィールドが設定されていない場合、既存の在庫情報が自動的に使用されます。
また、オーバーライドされた在庫フィールドの最新の更新時間は、メソッド呼び出しの時間にリセットされます。
プリロード済み在庫を含む CreateProduct
PROTO
{ parent: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch" product_id: "p123" product: { name: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" title: "some product" type: VARIANT } }
この例では、作成した商品に在庫フィールドが設定されていません。つまり、在庫更新メソッドを使用して更新された場合、プリロードされた在庫情報が自動的に使用されます。これは、在庫の更新をカタログの更新から切り離し、新しく作成した Product を既存の在庫情報と同期させる場合に便利です。
明示的な在庫のある CreateProduct
PROTO
{ parent: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch" product_id: "p123" product: { name: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" title: "some product" type: VARIANT availability: OUT_OF_STOCK fulfillment_info: { type: "pickup-in-store" } fulfillment_info: { type: "same-day-delivery" } } }
この例では、在庫フィールドを明示的に設定した Product が作成されます。これらのフィールドは、既存のフィールドをオーバーライドして、対応するフィールドの最終更新時刻を無視します。したがって、新しく作成された Product では可用性が OUT_OF_STOCK に設定され、場所 ID はフルフィルメント タイプ "pickup-in-store" と "same-day-delivery" をサポートしません。
在庫情報を含む CreateProduct は、プリロードされた在庫情報がすべて正確かどうか不明な場合や、Product の作成時にカタログと在庫を完全に同期するように在庫を明示的に設定します。
UpdateProduct
UpdateProduct メソッドを使用すると、既存のカタログ アイテムの特定の属性を更新できます。これは、1 つまたは複数のフィールドに対して同時に行うことができ、個々の商品に対して行うことも、インポート方法を使用して複数の商品に対して行うこともできます。マスクなしでインポート メソッドを使用すると、上書きが行われます。
UpdateProduct は、価格と在庫状況のリアルタイム更新によく使用されますが、商品のすべてのデータを再送信することなく、任意のフィールドを更新するために使用することもできます。(createMethod や importProducts とは対照的です)。
UpdateProduct を使用する主なメリットは、同期リクエストであることです。インデックス(および検索やレコメンデーション)の更新はほぼ瞬時に行われます。ただし、UpdateProduct は頻繁な更新を想定していません。デフォルトの割り当ては、1 分あたり 12,000 件の商品書き込みリクエストです。通常、このメソッドはアイテムの価格が変更された場合や、在庫状況が変更された場合にのみ使用します(数量が減少するたびに使用するわけではありません)。
UpdateProduct は商品レベルの属性のみを変更できます。localInventories または fulfillmentInfo のローカル在庫属性を変更するために使用することはできません。
UpdateProduct または ImportProducts で通話を行う場合は、updateMask パラメータを指定することが重要です。updateMask には、更新するフィールドのリストが含まれています。リクエストの本文でより多くのフィールドが渡されても、updateMask で指定されたフィールドのみが更新されます。更新リクエストまたはインポート リクエストに updateMask がない場合、すべてのフィールドがリクエスト本文で送信された内容に正確に更新されます。
UpdateProduct が呼び出され、フィールド マスク UpdateProductRequest.update_mask に在庫フィールドが含まれている場合、UpdateProductRequest.product で指定された値がそれぞれのフィールドに対してプリロードされた値をオーバーライドします。
また、オーバーライドされた在庫フィールドの最新の更新時間は、メソッド呼び出しの時間にリセットされます。
PROTO
{ product: { name: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" availability: IN_STOCK fulfillment_info: { type: "pickup-in-store" place_ids: "store0" place_ids: "store1" place_ids: "store2" place_ids: "store3" } fulfillment_info: { type: "same-day-delivery" } } update_mask: { paths: "availability" paths: "fulfillment_info" } }
この例は、各在庫フィールドの最新更新時刻に関係なく更新が適用されるという点を除き、SetInventory の例と非常によく似ています。
在庫の
UpdateProductは、タイムスタンプの保護を無視して、在庫情報の完全な同期が必要な場合に役立ちます。UpdateProductRequest.allow_missingをtrueに設定してProductupsert を実行することで、UpdateProductを使用して在庫情報をプリロードできます。このメソッドでは、UpdateProductRequest.product.titleなどの特定のカタログ フィールドを設定する必要があります。したがって、在庫更新メソッドを使用して、ユースケースをプリロードすることをおすすめします。
DeleteProduct
DeleteProduct が呼び出されると、DeleteProductRequest.name で指定した商品のすべての既存の在庫情報が削除されます。これには、各在庫の最新の更新時刻のすべてのレコードも含まれます。
商品レベルの属性を在庫レベルの属性に置き換える場合の考慮事項
各アプローチに関連する次の考慮事項と制限事項に注意してください。
| 機能 | 商品レベルの在庫 | 店舗レベル(ローカル)の在庫 |
|---|---|---|
| 検索フィルタとブースト コントロール | ○ | ○ |
facetSpec で指定されたフィルタとファセットキーの形式 |
○ | × |
| 検索ファセットで利用可能 | ○ | × |
| 検索レスポンスで返される | ○ | はい(variantRollupKeys を使用) |
| Recommendations AI v2 のフィルタとブースト コントロール | ○ | × |
| 機能 | 商品レベルの在庫 | 店舗レベル(ローカル)の在庫 |
|---|---|---|
| 検索フィルタとブーストのコントロール | ||
facetSpec で指定されたフィルタとファセットキーの形式 |
||
| 検索ファセットで利用可能 | ||
| 検索レスポンスで返される | (variantRollupKeys を使用) |
|
| Recommendations AI v2 のフィルタとブースト コントロール |
商品在庫、配送、ローカル価格の更新方法には、機能が重複している部分があります。
| 機能 | UpdateProduct |
setInventory |
addLocalInventories |
|---|---|---|---|
| リアルタイム アップデート | |||
| 商品フィールドを更新する | |||
| 商品価格を更新する | |||
| 商品の在庫状況を更新する | |||
fulfillmentInfo を更新する |
|||
localInventories を更新する(現地価格) |
|||
| タイムスタンプの順序付け |
例
このセクションでは、curl コマンドで UpdateProduct メソッドと setInventory メソッドを使用して商品の在庫を更新する方法について説明します。
UpdateProductは、REST API の HTTP PATCH メソッドを使用して、価格や在庫状況などの商品レベルのフィールドを同期的にリアルタイムで更新します。また、updateMaskを使用してimportメソッドを使用することで、バッチ更新にも使用できます。非同期の
setInventoryメソッドは、fulfillmentInfoを使用して商品レベルの在庫フィールド(価格、在庫状況、数量)とローカル フルフィルメントの詳細を更新するために示されていますが、localInventoriesに保存されているローカル価格や属性を変更することはできません。
UpdateProduct を使用して商品の価格と在庫状況を更新する
REST API を使用する場合、UpdateProduct は HTTP PATCH メソッドを使用します。CreateProduct、GetProduct、DeleteProduct と同じエンドポイント URL は、それぞれ HTTP PUT、GET、DELETE メソッドを使用します。次のリンクを開くと、それぞれの curl サンプルが表示されます。
setInventory を使用して商品の価格と在庫状況を更新する
setInventory でサポートされているフィールドは次のとおりです。
availabilityavailableQuantitypriceInfo
次のリンクを開くと、それぞれの curl サンプルが表示されます。
ローカル在庫の場合、この curl サンプルに示すように、placeIds とフルフィルメント タイプを fulfillmentInfo で渡すことができます。
チュートリアル
これらのチュートリアルでは、setInventory の使用方法や、フルフィルメントの追加または削除の方法について説明します。
在庫設定のチュートリアル
このチュートリアルでは、商品全体を更新する代わりに、SetInventory メソッドを使用して在庫の更新を push する方法を示します。
このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。
フルフィルメント追加のチュートリアル
AddFulfillmentPlaces ではなく AddLocalInventories メソッドを使用することをおすすめします。AddLocalInventories で同じ結果が得られますが、ローカル在庫データの取り込みをより細かく制御できます。詳細については、AddLocalInventories のドキュメントをご確認ください。
このチュートリアルでは、AddFulfillmentPlaces メソッドを使用して商品のフルフィルメント情報を更新する方法について説明します。このようにして、検索は商品が入手可能で注文が納品可能な場所の最新情報を表示できます。たとえば、買い物客が店で青いジーンズを探しているが、在庫切れになっているとします。このショップや他のショップにジーンズが再入荷した時点で、買い物客は更新情報を確認して注文を続行できます。
このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。
フルフィルメント削除のチュートリアル
RemoveFulfillmentPlaces ではなく RemoveLocalInventories メソッドを使用することをおすすめします。RmoveLocalInventories で同じ結果が得られますが、ローカル在庫データの取り込みをより細かく制御できます。詳細については、RemoveLocalInventories のドキュメントをご確認ください。
このチュートリアルでは、RemoveFulfillmentPlaces メソッドを使用して商品のフルフィルメント情報を更新する方法について説明します。このようにして、Vertex AI Search for Commerce は商品が入手不可能で注文が納品不可能な場所の最新情報を表示できます。このようにして、検索は商品が入手不可能で注文が納品不可能な場所の最新情報を表示できます。たとえば、買い物客が店で青いジーンズを探しているとします。ジーンズがこの店舗で在庫切れになった場合、買い物客はこれを見ると注文を続行できません。
このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。