検索結果を取得する

このページでは、テキストクエリ検索、ブラウジング検索、ページ分け、最適化、カスタマイズされた結果など、Retail Search の基本的なクエリについて説明します。

カスタマイズされた結果をエンドユーザーからキャッシュに保存したり、カスタマイズされた結果を別のエンドユーザーに戻したりすることはありません。

関連性は一致とは異なります。マッチングとは、ユーザーの検索語句に対応する商品候補をインデックス内で見つけることです。一方、関連性は一致の度合いです。ユーザーの意図とニーズを最も満たす方法で商品をランク付けします。Vertex AI Search for Retail は、一致と関連性を高める手法を使用して、小売業者のニーズを満たすユーザーの全体的な検索エクスペリエンスを向上させます。

小売業向け Vertex AI Search のデフォルトは、検索での関連性です。ただし、検索結果の上位に、関連性がやや低い商品も表示されるよう調整されています。これは、小売業者によりターゲットを絞った検索結果を提供し、ユーザー イベントのコンバージョンの可能性を高めることを目的としています。

追加された検索機能により、デフォルトの関連性アルゴリズムが最適化され、各小売店の利用プロファイルに合わせて調整されたデフォルト以外の機能が提供されます。これらの機能には次のものがあります。

  • 検索結果を並べ替えるオプション(価格、高評価、ベストセラーなど)。デフォルト以外の検索は、適切な商品バリエーションを含む特定の検索結果を返すようにカスタマイズされています。たとえば、価格で並べ替えたときに、最も安いまたは最も高いバリエーションを表示する場合などです。

  • デフォルト以外のユーザー イベントに対して、より厳格な関連性フィルタを自動的に適用。

  • 調整可能な強度のブースト/ベリー コントロールを有効にして、検索結果を微調整する。

Retail Search は、テキストクエリ検索機能とブラウズ検索機能の両方を提供します。

テキストクエリ検索のユースケースでは、買い物客がサイトにテキストベースのクエリを入力する可能性があります。Retail Search では、設定したコントロールのパラメータ内に収まる商品を含む検索レスポンスが、関連性と収益の最大化でソートされて返されます。

ブラウジングのユースケースでは、買い物客がサイトメニューから、特定の商品カテゴリに移動する可能性があります。Retail Search は、ユーザーの行動やトレンドから学習し、収益を最大化する表示順を自動的に選択します。ブラウジングの結果は、設定したコントロールでさらに絞り込むことができます。

テキスト検索リクエストとブラウジング検索リクエストの両方で、servingConfigs.search メソッドが使用されます。

テキストによるクエリ検索

ユーザーがテキストクエリを入力してサイトで検索すると、検索結果の候補が関連性、人気度、購入可能性、カスタマイズに基づいて並べ替えられます。

servingConfigs.search リクエストに空でない query フィールドが含まれている場合、検索はそれをテキストベースの検索リクエストと見なします。

ユーザー イベントをアップロードするときに、検索によって生成されたテキストクエリ検索イベントを search ユーザー イベントとして送信します。イベントに空でない userEvent.searchQuery フィールドと空の userEvent.pageCategories フィールドがある場合、Retail Search はそれをテキストベースの検索イベントとみなします。

ブラウジング検索

ブラウジングでは、サイト ナビゲーションを使用して、関連性が同じ検索結果をベストセラー商品で並べ替えて生成します。Retail Search は、AI を活用して、人気度、購入可能性、カスタマイズを考慮してブラウジング結果の並べ替え方法を最適化します。

空のクエリ フィールドと空でない page_categories フィールドを含むサービング リクエストとイベントは、ブラウジング リクエストとユーザー イベントと見なされます。page_categories フィールドには、ブラウジング ページ自体を指定します。servingConfigs.search メソッドでリクエストが送信されると、query フィールドが空の場合、Retail Search はブラウジング検索リクエストと見なします。その場合、結果は filter フィールドと pageCategories フィールド、可能な場合はさらなる最適化やカスタマイズに基づいて生成されます。

正しいブラウジング検索結果を得るには、次の点に注意してください。

  • 検索リクエスト内の pageCategoriesfilter の値は、アップロードされたユーザー イベントの pageCategoriesfilter の値と完全に一致する必要があります。アップロードしたユーザー イベントの filter 値。リクエストのパラメータがイベントのパラメータと一致しない場合、イベントから学習したクリックベースの再ランキング モデルは、この特定のクエリに対してあまり効果を発揮せず、結果の品質に悪影響を及ぼします。

  • search ユーザー イベントに空の userEvent.searchQuery フィールドと空でない userEvent.pageCategories フィールドがある場合、小売業向け Vertex AI Search はそれをブラウジング ベースのイベントに分類します。そのため、小売業向け Vertex AI Search によって生成されたブラウジング イベントをアップロードするときに、search ユーザー イベントとして送信する必要があります。

  • ブラウジング フィルタは有効なもので、ユーザーがブラウジングしている商品カテゴリに属する商品をブラウジング クエリごとに指定する必要があります。この設定を実現するには、カテゴリ ID を filter フィールドと page_category フィールドの両方で定義する必要があります。たとえば、検索結果を「ホーム&ガーデン」にターゲティングする場合は、まず、"in-stock"filter 値が 1 つしかないと、検索が十分に絞り込まれず、最適な閲覧結果が得られません。検索結果をホーム&ガーデンに限定するには、ページのカテゴリで "Home \& Garden" を設定するだけでなく、フィルタで categories: ANY("Home & Garden") も設定する必要があります。フィルタ部分でカテゴリを定義しなかった場合、ブラウジング結果が広範になりすぎ、ホーム&ガーデン以外の商品が多数含まれる可能性があります。

カテゴリは、次の例のように両方で設定できます。

JSON

page_category: "Home & Garden"
filter: "(availability: ANY("IN_STOCK")) AND (categories: ANY("Home & Garden"))"

そうでない場合、ブラウジングは空の文字列クエリで機能するため、特定のカテゴリの商品は、特定のページカテゴリの検索結果に自動的に表示されません。つまり、エンドユーザーがテキスト クエリを使用して何も指定せずにブラウジングした場合、ユーザーがカテゴリページに移動しても、検索結果に効果的なターゲティング結果が得られない可能性があります。

検索リクエストを使用する

検索リクエストを使用して、テキスト検索とブラウジング検索の両方の結果を取得します。 検索リクエストを実行するには、servingConfigs.search メソッドを使用します。

すべての検索リクエストに placement が必要です。それによって使用されるサービス構成の完全なリソース名を識別します。サービス構成により、検索結果に影響を与える設定と関連コントロールが決まります。

テキスト クエリ検索リクエストには、空でない query フィールドが必要です。

ブラウジング検索リクエストには、空でない pageCategories フィールドが必要です。

Java

import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;

public static void searchProducts(String query) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .build();

  try (SearchServiceClient searchClient = SearchServiceClient.create()) {
    SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();
    System.out.println("Search response: " + searchResponse);
  }
}

デフォルトでは、関連性の順に並べた結果での妥当な数が返されます。

検索レスポンスで返される商品属性を取得するには、カタログデータをインポートする際に必ず属性値を指定してください。 Product には、値を指定できる事前定義されたシステム属性(ブランド、色、サイズなど)があります。Product.attributes で定義したカスタム属性を含めることもできます。

クエリのチュートリアル

このチュートリアルでは、テキストベースの検索クエリを小売業向け Vertex AI Search に送信し、そのレスポンスを分析する方法について説明します。


このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


ページ分け

ページネーションを使用して、ルックアップ時間や送信されるレスポンスのサイズを減らします。

ページ分けのチュートリアル

このチュートリアルでは、テキストベースの検索リクエストでページネーションを制御する方法について説明します。買い物客が店内の商品を検索する際に、検索結果を通してナビゲーションを向上できます。たとえば、ページサイズ機能を使用して検索レスポンス内のアイテム数を制限したり、オフセット機能を使用して目的のページにジャンプしたりできます。


このタスクを Cloud Shell エディタで直接行う際のガイダンスについては、「ガイドを表示」をクリックしてください。

ガイドを表示


ページ設定

ページ間を移動するには、ユースケースに応じて page_token または offset を使用します。

次のページに移動するには、page_token を使用します。たとえば、次のような SearchRequest を送信するとします。

JSON

{
  placement: 'projects/PROJECT_NUMBER/locations/global/catalogs/default_catalog/placements/default_search'
  visitor_id: 'VISITOR_ID'
  query: 'shoes'
  page_size: 5
}

SearchResponse から、next_page_token とともに、関連性のある商品の上位 5 つの結果を取得します。

JSON

{
  results: [
    products{...}, products{...}, products{...}, products{...}, products{...}
  ]
  next_page_token: "wY4ETNkBDOlVjZ0YWLzUmM40SMhVjMtADMwATL5UGN5MGZlVDJaIQ5LaYsQUw9fC6lIwgE1EgC"
  total_size: 100
  search_token: "NtQKDAiXt4_3BRDCg_jnARABGiQ1ZWRjOTRlOC0wMDAwLTI1YTEtODJlMy1mNGY1ZTgwZDUxOGM"
}

次の 5 つの関連性(6~10 番目)で結果を取得するには、前の SearchResponsenext_page_token と同じ placementvisitor_idquery を使用して page_token を設定します。

Java

import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;

public static void searchProducts_withNextPageToken(String query, int pageSize)
    throws IOException, InterruptedException {
  try (SearchServiceClient searchClient = SearchServiceClient.create()) {
    SearchRequest firstRequest = SearchRequest.newBuilder()
        .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
        .setBranch(DEFAULT_BRANCH_NAME)
        .setVisitorId(VISITOR_ID)
        .setQuery(query)
        .setPageSize(pageSize)
        .build();

    SearchResponse firstResponse = searchClient.search(firstRequest).getPage()
        .getResponse();
    System.out.println("First search response: " + firstResponse);

    SearchRequest secondRequest = SearchRequest.newBuilder()
        .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
        .setBranch(DEFAULT_BRANCH_NAME)
        .setVisitorId(VISITOR_ID)
        .setQuery(query)
        .setPageSize(pageSize)
        .setPageToken(firstResponse.getNextPageToken())
        .build();

    SearchResponse secondResponse = searchClient.search(secondRequest).getPage()
        .getResponse();
    System.out.println("Second search response: " + secondResponse);
  }
}

この例では、SearchRequest は次のようになります。

JSON

{
  placement: 'projects/PROJECT_NUMBER/locations/global/catalogs/default_catalog/placements/default_search'
  visitor_id: 'VISITOR_ID'
  query: 'shoes'
  page_size: 5
  page_token: "wY4ETNkBDOlVjZ0YWLzUmM40SMhVjMtADMwATL5UGN5MGZlVDJaIQ5LaYsQUw9fC6lIwgE1EgC"
}

また、別の場合には、ページ間を移動する、または関連性の最も高い結果を得るのではなく、offset を使用して特定の位置に直接移動することもできます。

Java

import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;

public static void searchProducts_withOffset(String query, int pageSize,
    int offset) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setOffset(offset)
      .build();

  try (SearchServiceClient searchClient = SearchServiceClient.create()) {
    SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();
    System.out.println("Search response: " + searchResponse);
  }
}

たとえば、ページサイズが 5 で、結果の 10 ページ目が必要な場合は、offset を 45 に設定します。この値は (10 - 1) * 5 で計算されます。

JSON

{
  placement: 'projects/PROJECT_NUMBER/locations/global/catalogs/default_catalog/placements/default_search'
  visitor_id: 'VISITOR_ID'
  query: 'shoes'
  page_size: 5
  offset: 45
}

検索パフォーマンス階層

Retail Search には、結果をさらに向上させる複数の検索パフォーマンス階層が用意されています。たとえば、テキストクエリ検索のユースケースでは、結果は関連性のみに基づいている場合があります。より高度なパフォーマンス階層をロック解除すると、Retail Search は関連性、人気度、収益の最適化、カスタマイズに基づいた結果を返すことができます。

各階層の最小要件を満たすカタログとユーザー イベント データをアップロードすると、Retail Search は、上位のパフォーマンス階層を自動的にロック解除します。

このページを使用してデータ品質と検索パフォーマンス階層を表示する方法については、検索パフォーマンス階層のロック解除をご覧ください。Search for Retail コンソールの [データ品質] ページでは、各階層で満たされている要件の評価を確認できます。

テキスト検索とブラウジングの結果の評価

テキスト検索やブラウジング検索の結果をリクエストするためにウェブサイト コードを更新する前に、結果をプレビューして、サービス構成が期待どおりに機能していることを確認できます。

サービス構成について詳しくは、サービス構成についてをご覧ください。

サービス提供構成の結果は、[評価] ページから、または、コンソールでサービス提供構成の [詳細] ページにアクセスし、その [評価] タブをクリックしてプレビューできます。次の手順では、[評価] ページからプレビューする方法を説明します。

サービス構成で返される結果をプレビューするには:

  1. Search for Retail コンソールの [評価] ページに移動します。

    [評価] ページに移動

  2. [検索] タブをクリックします。

  3. プレビューするサービス構成を選択します。

  4. プレビューするカタログを含むカタログ ブランチを選択します。

  5. 省略可: ビジター ID を入力して、そのユーザーの検索結果をプレビューします。

  6. 省略可: ユーザー ID を入力して、そのユーザーの検索結果をプレビューします。

  7. 省略可: 検索時刻を入力して、指定した時刻に表示される検索結果をプレビューします。

    たとえば、ブラック フライデーに向けて特定のプロダクトをプロモーションした場合、その日に表示されるので結果を確認できます。

  8. 省略可: 結果と一緒に表示するファセットを選択し、[OK] をクリックして適用します。

    選択したファセットは、最初の検索を行った後に [ファセットの追加] に表示されるファセット フィルタのリストを生成するために使用されます。これらのファセット フィルタには、動的ファセットなど、このステップで選択したもの以外のファセットを含めることができます。

  9. テキストベースの検索クエリを入力して、そのクエリの検索結果をプレビューします。

  10. [検索プレビュー] をクリックするか、入力フィールドで Enter キーを押して結果を表示します。

    検索結果は利用可能なサムネイル画像とともに表示されます。

    検索でリダイレクト コントロールがトリガーされると、リダイレクト URI を示す通知が表示されます。

  11. 省略可: [グリッド] アイコンまたは [リスト] アイコンをクリックして、検索結果のプレビューの表示方法を切り替えます。

  12. 省略可: 結果とともに表示するファセットを選択した場合は、ファセット リストから 1 つ以上のファセット値を選択し、それらの値で結果をフィルタリングします。結果は、選択時に自動的に更新されます。

    同じファセットの複数の値を選択すると、それらは OR 演算子として適用され、異なるファセット間の値は AND 演算子として適用されます。たとえば、ファセット「」と値「青」と「ゴールド」、素材の値「コットン」と「ポリエステル」を選択するとします。検索結果には、属性として「青」または「ゴールド」が必要です。また、属性として「コットン」または「ポリエステル」も必要です。

参照

  1. Search for Retail コンソールの [評価] ページに移動します。

    [評価] ページに移動

  2. [ブラウジング] タブをクリックします。

  1. プレビューするサービス提供構成を選択します。

  2. プレビューするカタログを含むカタログ ブランチを選択します。

  3. 省略可: 訪問者 ID を入力して、そのユーザーの結果をプレビューします。

  4. 省略可: ユーザー ID を入力して、そのユーザーの結果をプレビューします。

  5. 特定のフィルタを追加した場合の検索結果をプレビューするには、フィルタ文字列を入力します。フィルタのドキュメントに記載されているフィルタ式の構文を使用します。

  6. 省略可: ブラウジング時間を入力して、指定した時間に表示される結果をプレビューします。

    たとえば、特定の商品をピーク セール イベントでプロモーションした場合、その日に表示されるので結果を確認できます。

  7. ブラウジング結果をテストするページカテゴリを入力します。

  8. 省略可: 結果と一緒に表示するファセットを選択し、[OK] をクリックして適用します。

    選択したファセットは、最初の検索を行った後に [ファセットの追加] に表示されるファセット フィルタのリストを生成するために使用されます。これらのファセット フィルタには、動的ファセットなど、このステップで選択したもの以外のファセットを含めることができます。

  9. [ブラウジング プレビュー] をクリックするか、入力フィールドで Enter キーを押して、結果を表示します。

    検索結果は利用可能なサムネイル画像とともに表示されます。

  10. 省略可: [グリッド] アイコンまたは [リスト] アイコンをクリックして、結果のプレビューの表示方法を切り替えます。

  11. 省略可: 結果とともに表示するファセットを選択した場合は、ファセット リストから 1 つ以上のファセット値を選択し、それらの値で結果をフィルタリングします。結果は、選択時に自動的に更新されます。

    同じファセットの複数の値を選択すると、それらは OR 演算子として適用され、異なるファセット間の値は AND 演算子として適用されます。たとえば、ファセット「」と「素材」を選択した後、色の値「青」と「ゴールド」、素材の値「コットン」と「ポリエステル」を選択して検索結果をフィルタリングする場合があります。結果には、属性として「青」または「ゴールド」が必要です。また、属性として「コットン」または「ポリエステル」も必要です。

プレビューしているサービス提供構成の [詳細] ページを表示するには、[サービス提供構成を選択] フィールドで [サービス提供構成を表示] をクリックします。