検索結果を取得する

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

一意のユーザー セッション ID

必須の visitor_id 文字列フィールドは、1 台のデバイス上のユーザーを一意に識別するために使用されます。これは永続的なセッション識別子として機能し、AI Commerce Search がショッピング ジャーニー全体で特定のユーザーの行動を追跡できるようにします。

AI Commerce Search は、特定の visitor_id に関連付けられた履歴を使用してモデルをトレーニングし、パーソナライズされた検索結果を提供します。システムは、リクエストで指定された特定の visitor_id に基づいて結果を動的に生成します。たとえば、訪問者が緑色のドレスを頻繁に閲覧している場合、モデルは visitor_id を使用して後で訪問者を認識し、検索結果で類似アイテムを優先的に表示します。このため、訪問者 ID は、ユーザー イベントの取り込み(トラッキング)と検索またはレコメンデーションのリクエスト(サービス提供)の両方で同じ形式にする必要があります。

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

検索はデフォルトで関連性の高い順に表示されます。ただし、関連性のない商品がデフォルトの検索結果の下部や、明示的な商品検索リクエストに表示されることがあります。これは、orderBy を設定した場合にのみ顕著になります。これは、一般的に検索結果のサイズが小さくなるためです。再現率のサイズは減少します。これは、以前はデフォルトの検索結果の下部に表示されていた関連性の低い商品が、ある程度除外されるためです。検索をカスタマイズする方法については、次のセクションをご覧ください。

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

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

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

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

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

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

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

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

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

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

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

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

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

テキストクエリとパラメータの処理方法

標準クエリは言語分析を受け、標準的な句読点が削除されます。フィルタ文字列では大文字と小文字が厳密に区別されます。AI Commerce Search で API リクエストを適切に作成するには、テキストクエリとパラメータの処理方法を理解することが重要です。

  • クエリのトークン化と句読点: query フィールドに渡された自然言語テキストは、自動言語分析とスペル修正を受けます。このプロセスでは、自然言語理解を最適化するために、標準的な句読点(カンマ、ピリオド、+、- など)が削除されるか、無視されることがよくあります。
  • 単数形と複数形の検索語句: AI Commerce Search は、エンドユーザーの意図と、クリックや購入などの過去のユーザー エンゲージメントに基づいて、単数形と複数形の検索を個別に評価します。買い物客は、単数形と複数形の用語で異なる商品をクリックまたは購入することがよくあります。たとえば、1 枚のシャツの場合は t-shirt、マルチパックの場合は t-shirts です。その結果、単数形と複数形のクエリでは、検索結果、ランキング、動的ファセットが異なる場合があります。1 つのクエリ形式が少数の商品にのみ一致する場合、クエリ拡張によってそのクエリの結果を広げることもできます。カタログの言語で単数形、複数形、語形変化した用語を拡張して、互いの候補を含めるには、双方向の類義語コントロールを構成します。
  • パラメータでの厳格な大文字と小文字の区別: 標準のテキストクエリでは通常、大文字と小文字は区別されませんが、プログラム パラメータでは厳格に区別されます。
    • フィルタ: フィルタ式とそのリテラル文字列値では、大文字と小文字を区別します。
    • 並べ替え: orderBy 式では大文字と小文字が区別されます。products.title などのフィールドで並べ替えると、エンジンは Apple、banana、artichoke の順に並べ替えます。回避策として、オール キャップスの商品タイトルを別のカスタム属性(attributes.title_upper など)にアップロードし、その属性で並べ替えることで、大文字と小文字を区別しない並べ替えを実現できます。
  • 予約済みの特殊文字:
    • > 文字は、カテゴリ階層の区切り文字(Categories > Shoes など)として厳密に予約されています。> がカテゴリ名に自然に発生する場合は、取り込みとクエリの前に別の文字に置き換える必要があります。
    • / 文字は、レコメンデーション フィルタ式のテキスト値ではサポートされていません。

ブラウジング検索

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

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

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

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

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

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

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

JSON

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

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

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

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

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

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

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

Python

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。詳細については、AI Commerce Search Python API リファレンス ドキュメントをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]


# get search service request:
def get_search_request(query: str):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    search_request = SearchRequest()
    search_request.placement = default_search_placement  # Placement is used to identify the Serving Config name.
    search_request.query = query
    search_request.visitor_id = "123456"  # A unique identifier to track visitors
    search_request.page_size = 10

    print("---search request:---")
    print(search_request)

    return search_request


# call the Retail Search:
def search():
    # TRY DIFFERENT QUERY PHRASES HERE:
    query_phrase = "Hoodie"

    search_request = get_search_request(query_phrase)
    search_response = SearchServiceClient().search(search_request)

    print("---search response---")
    if not search_response.results:
        print("The search operation returned no matching results.")
    else:
        print(search_response)
    return search_response


search()

Node.js

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

'use strict';

async function main() {
  // Call Retail API to search for a products in a catalog using only search query.

  // Imports the Google Cloud client library.
  const {SearchServiceClient} = require('@google-cloud/retail');

  // Instantiates a client.
  const retailClient = new SearchServiceClient();

  const projectId = await retailClient.getProjectId();

  // Placement is used to identify the Serving Config name.
  const placement = `projects/${projectId}/locations/global/catalogs/default_catalog/placements/default_search`;

  // Raw search query.
  const query = 'Hoodie'; //TRY DIFFERENT QUERY PHRASES

  // A unique identifier for tracking visitors.
  const visitorId = '12345';

  // Maximum number of Products to return.
  const pageSize = 10;

  const IResponseParams = {
    ISearchResult: 0,
    ISearchRequest: 1,
    ISearchResponse: 2,
  };

  const callSearch = async () => {
    console.log('Search start');
    // Construct request
    const request = {
      placement,
      query,
      visitorId,
      pageSize,
    };
    console.log('Search request: ', request);

    // Run request
    const response = await retailClient.search(request, {
      autoPaginate: false,
    });
    const searchResponse = response[IResponseParams.ISearchResponse];
    if (searchResponse.totalSize === 0) {
      console.log('The search operation returned no matching results.');
    } else {
      console.log('Search result: ', JSON.stringify(searchResponse, null, 4));
    }
    console.log('Search end');
  };

  callSearch();
}

process.on('unhandledRejection', err => {
  console.error(err.message);
  process.exitCode = 1;
});

main();

Java

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。詳細については、AI Commerce Search Java API リファレンス ドキュメントをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.cloud.ServiceOptions;
import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;
import java.io.IOException;
import java.util.UUID;

public class SearchSimpleQuery {

  public static void main(String[] args) throws IOException {
    String projectId = ServiceOptions.getDefaultProjectId();
    String defaultCatalogName =
        String.format("projects/%s/locations/global/catalogs/default_catalog", projectId);
    String defaultSearchPlacementName = defaultCatalogName + "/placements/default_search";

    searchResponse(defaultSearchPlacementName);
  }

  public static void searchResponse(String defaultSearchPlacementName) throws IOException {
    // TRY DIFFERENT QUERY PHRASES HERE:
    String queryPhrase = "Hoodie";
    String visitorId = UUID.randomUUID().toString();
    int pageSize = 10;

    SearchRequest searchRequest =
        SearchRequest.newBuilder()
            .setPlacement(defaultSearchPlacementName)
            .setQuery(queryPhrase)
            .setVisitorId(visitorId)
            .setPageSize(pageSize)
            .build();
    System.out.println("Search request: " + searchRequest);

    // Initialize client that will be used to send requests. This client only
    // needs to be created once, and can be reused for multiple requests. After
    // completing all of your requests, call the "close" method on the client to
    // safely clean up any remaining background resources.
    try (SearchServiceClient client = SearchServiceClient.create()) {
      SearchResponse searchResponse = client.search(searchRequest).getPage().getResponse();
      if (searchResponse.getTotalSize() == 0) {
        System.out.println("The search operation returned no matching results.");
      } else {
        System.out.println("Search response: " + searchResponse);
      }
    }
  }
}

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

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

クエリのチュートリアル

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

予測入力の候補を使用して検索結果をフィルタする

フロントエンドに拡張された予測入力の候補を実装している場合(ユーザーが特定のブランドやカテゴリと組み合わせたクエリを選択できる場合)、その選択をフィルタされた SearchRequest に変換する必要があります。

これを実装するには、テキスト候補を抽出して query フィールドに配置し、選択した属性(ブランドなど)を抽出して filter フィールドに式としてフォーマットします。

フィルタされた候補からの検索リクエストの例

ユーザーが Nike の候補 shoe をクリックした場合、SearchRequest を次のように構成します。

{
  "placement": "projects/YOUR_PROJECT_ID/locations/global/catalogs/default_catalog/placements/default_search",
  "query": "shoe",
  "filter": "brands: ANY(\"Nike\")",
  "visitorId": "user_session_123"
}

候補ファセットに商品数を追加する

フィルタリング エクスペリエンスをさらに向上させるために、ユーザーが検索を実行する前に、各候補フィルタで利用可能な商品の数を表示できます。商品数で候補ファセットを使用するには、サポートに連絡してこの機能を有効にする必要があります。有効にすると、特定のテキスト ファセットキーが SearchRequest の facetSpecs に 7 日以上含まれ、システムが検索履歴データに基づいて商品数を計算できるようになります。

ページ分け

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

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

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

ページ設定

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

Python

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。詳細については、AI Commerce Search Python API リファレンス ドキュメントをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。


import google.auth
from google.cloud.retail import SearchRequest, SearchServiceClient

project_id = google.auth.default()[1]


# get search service request:
def get_search_request(query: str, page_size: int, offset: int, next_page_token: str):
    default_search_placement = (
        "projects/"
        + project_id
        + "/locations/global/catalogs/default_catalog/placements/default_search"
    )

    search_request = SearchRequest()
    search_request.placement = default_search_placement
    search_request.visitor_id = "123456"  # A unique identifier to track visitors
    search_request.query = query
    search_request.page_size = page_size
    search_request.offset = offset
    search_request.page_token = next_page_token

    print("---search request:---")
    print(search_request)

    return search_request


# call the Retail Search:
def search():
    # TRY DIFFERENT PAGINATION PARAMETERS HERE:
    page_size = 6
    offset = 0
    page_token = ""

    search_request_first_page = get_search_request(
        "Hoodie", page_size, offset, page_token
    )
    search_response_first_page = SearchServiceClient().search(search_request_first_page)

    print("---search response---")
    if not search_response_first_page.results:
        print("The search operation returned no matching results.")
    else:
        print(search_response_first_page)

    # PASTE CALL WITH NEXT PAGE TOKEN HERE:

    # PASTE CALL WITH OFFSET HERE:

    return search_response_first_page


search()

Node.js

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

async function main() {
  // Imports the Google Cloud client library.
  const {SearchServiceClient} = require('@google-cloud/retail');

  // Instantiates a client.
  const retailClient = new SearchServiceClient();

  const projectId = await retailClient.getProjectId();

  // Placement is used to identify the Serving Config name.
  const placement = `projects/${projectId}/locations/global/catalogs/default_catalog/placements/default_search`;

  // Raw search query.
  const query = 'Hoodie';

  // A unique identifier for tracking visitors.
  const visitorId = '12345';

  // Maximum number of Products to return.
  const pageSize = 6; // TRY DIFFERENT PAGE SIZES, INCLUDING THOSE OVER 100

  // A 0-indexed integer that specifies the current offset in search results.
  const offset = 0; // TRY DIFFERENT OFFSETS TO SEE DIFFERENT PRODUCTS

  //A page token received from a previous search call.
  let pageToken = '';

  const IResponseParams = {
    ISearchResult: 0,
    ISearchRequest: 1,
    ISearchResponse: 2,
  };

  const callSearch = async () => {
    console.log('Search start');
    // Construct request
    const request = {
      placement,
      query,
      visitorId,
      pageSize,
      offset,
      pageToken,
    };

    // Run request
    const response = await retailClient.search(request, {
      autoPaginate: false,
    });
    const searchResponse = response[IResponseParams.ISearchResponse];
    if (searchResponse.totalSize === 0) {
      console.log('The search operation returned no matching results.');
    } else {
      console.log('Search result: ', JSON.stringify(searchResponse, null, 4));
      pageToken = response[IResponseParams.ISearchResponse].nextPageToken;
      console.log(
        'Next page token:',
        response[IResponseParams.ISearchResponse].nextPageToken
      );
    }
    console.log('Search end');
  };

  // Call search
  await callSearch();

  //PASTE CALL WITH NEXT PAGE TOKEN HERE:
}

Java

AI Commerce Search のクライアント ライブラリをインストールして使用する方法については、AI Commerce Search クライアント ライブラリをご覧ください。詳細については、AI Commerce Search Java API リファレンス ドキュメントをご覧ください。

AI Commerce Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.cloud.ServiceOptions;
import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;
import java.io.IOException;
import java.util.UUID;

public class SearchWithPagination {

  public static void main(String[] args) throws IOException {
    String projectId = ServiceOptions.getDefaultProjectId();
    String defaultCatalogName =
        String.format("projects/%s/locations/global/catalogs/default_catalog", projectId);
    String defaultSearchPlacementName = defaultCatalogName + "/placements/default_search";

    searchResponse(defaultSearchPlacementName);
  }

  public static void searchResponse(String defaultSearchPlacementName) throws IOException {
    // TRY DIFFERENT PAGINATION PARAMETERS HERE:
    int pageSize = 6;
    String queryPhrase = "Hoodie";
    int offset = 0;
    String pageToken = "";
    String visitorId = UUID.randomUUID().toString();

    SearchRequest searchRequest =
        SearchRequest.newBuilder()
            .setPlacement(defaultSearchPlacementName)
            .setVisitorId(visitorId)
            .setQuery(queryPhrase)
            .setPageSize(pageSize)
            .setOffset(offset)
            .setPageToken(pageToken)
            .build();
    System.out.println("Search request: " + searchRequest);

    // Initialize client that will be used to send requests. This client only
    // needs to be created once, and can be reused for multiple requests. After
    // completing all of your requests, call the "close" method on the client to
    // safely clean up any remaining background resources.
    try (SearchServiceClient client = SearchServiceClient.create()) {
      SearchResponse searchResponseFirstPage = client.search(searchRequest).getPage().getResponse();
      if (searchResponseFirstPage.getTotalSize() == 0) {
        System.out.println("The search operation returned no matching results.");
      } else {
        System.out.println("Search response: " + searchResponseFirstPage);
      }

      // PASTE CALL WITH NEXT PAGE TOKEN HERE:

      // PASTE CALL WITH OFFSET HERE:
    }
  }
}

ページトークン

次のページに移動するには、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 番目)で結果を取得するには、前の SearchResponse の next_page_token と同じ placement、visitor_id、query を使用して 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 を使用して特定の位置に直接移動することもできます。

たとえば、ページサイズが 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 は、上位のパフォーマンス階層を自動的にロック解除します。

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

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

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

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

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

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

  1. Gemini Enterprise for Customer Experience コンソールの AI Commerce Search の [評価] ページに移動します。

    [評価] ページに移動

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

参照

  1. Gemini Enterprise for Customer Experience コンソールの AI Commerce Search の [評価] ページに移動します。

    [評価] ページに移動

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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