結果をフィルタリングして並べ替える

このページでは、検索でのフィルタリングと並べ替えについて説明します。

セマンティック フィルタリングでデフォルト以外の並べ替えを最適化する

小売業向け Vertex AI Search は、人気やトレンドにある、関連性が低いアイテムなど、さまざまな結果を表示するように設計されています。これはデフォルトの検索(関連性の高い順に並べ替え)では効果的ですが、価格順などの order_by 機能を使用したデフォルト以外の検索では、価格が低いために関連性が低い商品が目立つように表示される可能性があります。

この影響を軽減するために、小売業向け Vertex AI Search では、セマンティック エンベディング ベースのフィルタリングを導入し、デフォルト以外の検索結果から関連性が低いアイテムを削除して、ユーザー エクスペリエンスを改善しています。

ただし、この動作により、検索結果の数が全体的に減少する可能性があります。フィルタを無効にすると、検索結果の品質に影響する可能性があります。検索結果が少ない場合は、サポートにお問い合わせください。

フィルタリングのチュートリアル

このチュートリアルでは、フィルタリング機能について説明します。ご自身やお客様のニーズに応じて、検索リクエストを細かく調整できます。単一または複数のフィールドでフィルタしたり、テキスト フィールドまたは数値フィールド、またはその両方でフィルタすることもできます。式言語を使用すると、フィールドごとに述語を作成したり、論理演算子を使用してさまざまな式を結合したりできます。たとえば、靴を探している買い物客はフィルタを使用して、目的のブランドや色に検索結果を絞り込めます。


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

ガイドを表示


並べ替えのチュートリアル

このチュートリアルでは、検索レスポンス内のアイテムを並べ替える方法について説明します。エンドユーザーがサイトで商品を検索すると、複数のフィールドで並べ替えられた結果が表示されます。たとえば、ユーザーが価格と割引が最高のドレスを探しているとします。ここでは価格と割引のフィールドが複数あります。ユーザーには、ドレスが価格順に表示され、同じ価格のドレスについて割引順に表示されます。


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

ガイドを表示


データセットの例

このページでは、次のデータセットを例として使用します。例に必要なフィールドのみが含まれています。

フィルタ

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 searchFilteredProducts(String query, int pageSize,
    String filter) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setFilter(filter)
      .build();

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

フィルタ式の構文は、次の EBNF に要約できます。

  # A single expression or multiple expressions that are joined by "AND" or "OR".
  filter = expression, { " AND " | "OR", expression };

  # Expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
    # A parenthetical expression.
    | "(", expression, ")"
    # A simple expression applying to a text field.
    # Function "ANY" returns true if the field contains any of the literals.
    ( text_field, ":", "ANY", "(", literal, { ",", literal }, ")"
    # A simple expression applying to a numerical field. Function "IN" returns true
    # if a field value is within the range. By default, lower_bound is inclusive and
    # upper_bound is exclusive.
    | numerical_field, ":", "IN", "(", lower_bound, ",", upper_bound, ")"
    # A simple expression that applies to a numerical field and compares with a double value.
    | numerical_field, comparison, double );

  # A lower_bound is either a double or "*", which represents negative infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";

  # An upper_bound is either a double or "*", which represents infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  upper_bound = ( double, [ "e" | "i" ] ) | "*";

  # Supported comparison operators.
  comparison = "<=" | "<" | ">=" | ">" | "=";

  # A literal is any double quoted string. You must escape backslash (\) and
  # quote (") characters.
  literal = double quoted string;

  text_field = see the table below;

  numerical_field = see the table below;

サポートされているテキスト項目を次の表にまとめます。

フィールド 説明
「productId」 商品 ID(Product.name の最後のセグメント)。
「brands」 Product.brands。
「categories」 Product.categories。
「genders」 Audience.genders。
「ageGroups」 Audience.age_groups。
「availability」 Product.availability。値は「IN_STOCK」、「OUT_OF_STOCK」、「PREORDER」、「BACKORDER」のいずれかです。
「colorFamilies」 ColorInfo.color_families。
「colors」 ColorInfo.colors。
「sizes」 Product.sizes。
「materials」 Product.materials。
「patterns」 Product.patterns。
「conditions」 Product.conditions。
「attributes.key」 商品オブジェクトのテキスト カスタム属性。属性値がテキストの場合、キーは、Product.attributes マップ内の任意のキーです。
「pickupInStore」 「pickup-in-store」タイプの FulfillmentInfo.place_ids。
「shipToStore」 「ship-to-store」タイプの FulfillmentInfo.place_ids。
「sameDayDelivery」 「same-day-Delivery」タイプの FulfillmentInfo.place_ids。
「nextDayDelivery」 「next-day-Delivery」タイプの FulfillmentInfo.place_ids。
「customFulfillment1」 「custom-type-1」タイプの FulfillmentInfo.place_ids。
「customFulfillment2」 「custom-type-2」タイプの FulfillmentInfo.place_ids。
「customFulfillment3」 「custom-type-3」タイプの FulfillmentInfo.place_ids。
「customFulfillment4」 「custom-type-4」タイプの FulfillmentInfo.place_ids。
「customFulfillment5」 「custom-type-5」タイプの FulfillmentInfo.place_ids。
「inventory(place_id,attributes.key)」 在庫内のテキスト カスタム属性。

サポートされている数値の項目を次の表にまとめます。

フィールド 説明
「price」 PriceInfo.price。
「discount」 discount。(original_price - price) ÷ original_price で算出されます。
「rating」 Rating.average_rating。
「ratingCount」 Rating.rating_count。
「attributes.key」 商品オブジェクトの数値カスタム属性。属性値が数値の場合、キーは、Product.attributes マップ内の任意のキーです。
「inventory(place_id,price)」 在庫価格。
「inventory(place_id,original_price)」 元の在庫価格。
「inventory(place_id,attributes.key)」 在庫内の数値カスタム属性。

ネストされた結合または分離は最大 10 個まで指定できます。

たとえば、次のような状況で Google プロダクトを検索するには、query を「Google」に設定し、次の表に表示される値として filter を設定します。

シナリオ フィルタ
Pixel のアクセサリではない 「NOT categories: ANY(\"Pixel > featured accessories\")」
「100 ドル未満」 「price: IN(*, 100.0e)」
「Nest スピーカーは 80 ドル未満ではない」 「(categories: ANY(\"Nest > speakers and displays\")) AND (price: IN(80.0i, *))」

注文

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 searchOrderedProducts(String query, int pageSize,
    String orderBy) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setOrderBy(orderBy)
      .build();

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

サポートされている順序付け可能な項目を次の表にまとめます。

フィールド 説明
「productId」 商品 ID(Product.name の最後のセグメント)。
「title」 Product.title。
「brands」 Product.brands。
「categories」 Product.categories。
「genders」 Audience.genders。
「ageGroups」 Audience.age_groups。
「price」 PriceInfo.price。
「discount」 discount。(元の価格 - 価格)÷ 価格で算出されます。
「rating」 Rating.average_rating。
「ratingCount」 Rating.rating_count。
「attributes.key」 商品オブジェクトのカスタム属性。キーは、Product.attributes マップ内の任意のキーです。
「inventory(place_id,price)」 在庫価格。
「inventory(place_id,original_price)」 元の在庫価格。
「inventory(place_id,attributes.key)」 在庫内の数値またはテキストのカスタム属性。

デフォルトでは、順序は昇順です。降順は、「desc」接尾辞で指定できます(例: rating desc)。

複数の値を持つ数値フィールド(繰り返しフィールドやバリエーション商品に設定されたフィールドなど)の場合、最小値は昇順の並べ替えに使用され、最大値は降順の並べ替えに使用されます。

複数のフィールドによる順序付けは、優先度順のカンマ区切りフィールドを使用することでサポートされます。優先度の低い項目は、優先度が高い同一価格の商品アイテムの順序付けに使用されます。たとえば、「rating desc, price」は、評価が同じである商品を価格によって順序付けます。