このページでは、AI Commerce Search API を使用して、AI Commerce Search カタログのリアルタイムの価格と在庫数の更新を管理する方法について説明します。
Product の作成、読み取り、更新、削除(CRUD)メソッドは Product の属性の広範な変更に使用されますが、在庫に固有のフィールドをさまざまな粒度で更新するために使用する一連の Product メソッドもあります。
在庫について
一般に、在庫とは、e コマース サイトの商品アイテムの在庫レベル(在庫数)と価格を指します。AI Commerce Search API の場合、inventory は、価格、在庫状況、利用可能な数量、フルフィルメント情報、ローカル価格、その他のローカル属性を指します。これらのフィールドは、次のフィールドを使用して Product スキーマで定義されます。
Product.availabilityProduct.availableQuantityProduct.priceInfoProduct.fulfillmentInfoProduct.localInventories
商品レベルの在庫
オンライン カタログのみを使用する e コマースサイトの販売者の場合、inventory は通常、カタログ内の商品としてのみ表されます。価格、在庫状況、その他のすべてのデータは、カタログ内の各 Product エントリに設定されます。fulfillmentInfo フィールドと localInventories フィールドは使用されません。
ローカル在庫
複数の店舗を持つ小売業者の場合、商品はカタログ内の Product エントリで表されますが、addLocalInventories メソッドを使用して、商品の店舗(placeId)にローカル在庫(価格、在庫状況、フルフィルメント)を追加できます。
ローカル在庫に使用される Product フィールドは、Product.fulfillmentInfo と Product.localInventories の 2 つです。要件に応じて、どちらか一方または両方を使用できます。fulfillmentInfo と localInventories はどちらも、関連データを含む店舗のリストです。
fulfillmentInfo は、特定店舗での商品のフルフィルメント方法を指定します。一方、localInventories は、各店舗の価格やその他のカスタム属性を指定します。
特定店舗で商品を在庫なしまたは販売終了としてマークするには、removeLocalInventories メソッドを使用して、特定の placeId の商品の fulfillment と inventory を削除します。
広告枠更新メソッド
商品の在庫情報の変更は、カタログ情報の変更よりも頻繁に発生する可能性があります。そのため、在庫固有の更新を大量に処理するための特別な一連のメソッドが提供されます。これらのメソッドは、パフォーマンスを犠牲にすることなく、商品ごとに数百の同時更新をサポートするダウンストリームの最適化のために、非同期になっています。
増分更新
ローカル在庫の更新ガイドに従って、在庫の増分更新を行います。新しい API メソッドは、場所ごとの在庫属性をよりきめ細かく制御できます。
fulfillment_info は、Product に対する場所レベルのフルフィルメントの可用性をエンコードするためによく使用されます。場合によっては、特定の場所のフルフィルメントの可用性が変わることがあります。`UpdateProduct` メソッドを使用して商品全体のフルフィルメント情報を再指定する代わりに、この
変更を説明する更新を発行することを決定できます。
そのような場合、AddFulfillmentPlaces と
RemoveFulfillmentPlaces メソッドを使用して、
特定のフルフィルメント タイプに対して追加または削除される場所 ID に基づいて商品のフルフィルメントの変更を
段階的に更新できます。
Java
AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、 AI Commerce Search クライアント ライブラリをご覧ください。 詳細については、 AI Commerce Search Java API リファレンス ドキュメントをご覧ください。
AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。 詳細については、 ローカル開発環境の認証の設定をご覧ください。
.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
AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、 AI Commerce Search クライアント ライブラリをご覧ください。 詳細については、 AI Commerce Search Java API リファレンス ドキュメントをご覧ください。
AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。 詳細については、 ローカル開発環境の認証の設定をご覧ください。
.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 メソッドを使用すると、既存のカタログ アイテムの特定の属性を更新できます。これは、単一または複数のフィールドに対して同時に行うことができます。また、個々の商品に対して行うことも、import メソッドを使用して複数の商品に対して行うこともできます。マスクなしで import メソッドを使用すると、上書きされます。
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このようにして、AI Commerce Search は商品が入手不可能で注文が納品不可能な場所の最新情報を表示できます。このようにして、検索は商品が入手不可能で注文が納品不可能な場所の最新情報を表示できます。たとえば、買い物客が店で青いジーンズを探しているとします。ジーンズがこの店舗で在庫切れになった場合、買い物客はこれを見ると注文を続行できません。
このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。