クエリ拡張

クエリ拡張とは、最初に結果が見つからない場合や、結果が少なすぎる場合に、クエリ制約を段階的に緩和して、より多くの結果を含めることです。これにより、クエリあたりの結果サイズが調整されます。

クエリに関連するドキュメントがまったくない場合、クエリが検索結果を返さないことがないように、クエリ拡張機能は関連性の低いドキュメントを返します。

クエリ拡張のチュートリアル

このチュートリアルでは、クエリ拡張機能を有効にする方法について説明します。買い物客があいまいなまたは複数の単語からなる検索フレーズを使用すると、空のレスポンスが返される場合があります。クエリ拡張を有効にすると、リクエストが分析され、解析された検索クエリに基づいて商品の拡張リストが返されます。


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

ガイドを表示


クエリ拡張の概要

クエリ拡張は、特にロングテール クエリや複雑なユーザー クエリで、検索の再現率を高め、結果がゼロになるシナリオを防ぐように設計された強力な機能です。

商品カタログで完全一致が見つからない場合に結果を返さないのではなく、クエリ拡張機能は関連商品や代替商品を特定して表示します。これにより、ユーザー エクスペリエンスが向上し、コンバージョン率の増加が期待できます。

クエリ拡張の主なユースケースは次のとおりです。

  • ロングテール クエリ: 糖尿病患者向けの高タンパク質低脂肪のオーガニック牛乳など、非常に具体的な検索の場合、カタログに完全に一致する商品がないことがあります。クエリ拡張では、インテントの一部に一致する商品(糖尿病患者向けの牛乳、高タンパク質の牛乳などの属性や属性値でタグ付けされた商品など)が返されることがあります。
  • 代替商品: ユーザーがカタログにないブランドや商品(「スターバックス コーヒー 100ml」など)を検索した場合、クエリ拡張機能によって購入可能な代替のコーヒー ブランドが提案され、検索が行き詰まるのを防ぐことができます。

以降のセクションでは、Vertex AI Search for Commerce のクエリ拡張機能の機能、トリガー メカニズム、構成のニュアンスについて説明します。特に、正規フィルタの重要な役割に焦点を当てます。

クエリ拡張のトリガー メカニズム

クエリ拡張機能または特定の検索クエリを有効にするかどうかは、自動的に判断され、すぐに設定できる正規フィルタ ルールに基づきます。

  • トリガー条件: クエリ拡張は、正規フィルタ クエリを使用した最初の検索で 3 件未満の商品結果が得られた場合にのみトリガーされます。
  • しきい値: デフォルトのしきい値は 3 ですが、変更できます。ほとんどの e コマースのユースケースでうまく機能し、最初の結果セットが本当にスパースである場合にのみクエリ拡張が有効になるようにします。

トップレベル フィルタと正規フィルタの違いを理解する

クエリ拡張を正しく実装するには、検索リクエストの 2 つの主要なフィルタ パラメータを理解することが重要です。

  • トップレベルのフィルタ(filter: 検索結果がユーザーに返される前に適用されるメインのフィルタです。これは、次の 2 つのレイヤの組み合わせです。

    • ビジネス/ベースフィルタ: inStock=TRUE, category="groceries", storeId="XYZ" など、ユーザーが直接入力することなく、すべての検索に適用される事前定義ルール。

    • ユーザーが選択したファセット フィルタ: 検索インターフェースの操作中にユーザーが動的に適用するフィルタ(brand="Adidas", size="L" のファセット フィルタを選択するなど)。

  • 正規フィルタ(canonical_filter: クエリ拡張決定モジュールでのみ使用される特殊なフィルタです。この関数は、クエリ拡張トリガー条件(結果が 5 件未満)が評価されるカタログ ビューを定義するだけです。

コア正規フィルタ関数

正規フィルタは、オーガニック検索結果の質が低い場合と、ユーザーが意図的に絞り込んだ結果セットとを区別するために設計されています。

シナリオ 1

  • ユーザー ジャーニー: ユーザーが「t-shirt」を検索し、数千件の結果が表示される。デフォルトの business_filter があり、たとえば、在庫のある商品と店舗レベルのカスタム属性に一致する商品のみをフィルタします。次に、ユーザーがブランド="Adidas"、サイズ="L" のファセット フィルタを適用すると、結果の数が 2 つに減ります。
  • canonical_filterfilter と同じ場合: クエリ拡張の決定システムは 2 件の結果しか認識せず、クエリ拡張を誤ってトリガーして、関連性はあるものの無関係な商品(Nike の T シャツなど)を表示します。これは、ユーザーの明示的なフィルタリングを無視するものです。
  • 正しい設定は canonical_filter = business filter です。canonical_filter = business filter: クエリ拡張の決定は、ユーザーが選択したファセットを除外した初期クエリに基づいて行う必要があります。

シナリオ 2

  • ユーザー ジャーニー: ユーザーが「黒いグラフィック プリントの入ったアディダスの T シャツ」を検索すると、結果が 1 つか 2 つしか表示されない。デフォルトの business_filter があり、たとえば、在庫のある商品と店舗レベルのカスタム属性に一致する商品のみをフィルタします。
  • canonical_filter が設定されていないか、正しく構成されていない場合、正規フィルタを使用した検索で、クエリに一致するものの在庫切れの商品や、別の店舗の商品(カスタム店舗レベル属性の値が異なる商品)が見つかる可能性があります。この場合、クエリ拡張はトリガーされません。
  • 正しい設定は canonical_filter = business filter です。クエリ拡張の決定では、指定された長いクエリに対して 3 つ未満の商品が見つかり、クエリ拡張がトリガーされて、関連商品が元のクエリに追加されます。つまり、在庫があり、店舗レベルの属性と一致する商品が追加されます。そのため、検索結果は、別のブランドの黒いグラフィック プリント T シャツ、他の色のグラフィック プリント T シャツ、またはクエリ内のブランドの他の T シャツ商品を含むように拡大されます。

クエリ拡張のベスト プラクティス

正規フィルタは、ほとんどの場合、ビジネス フィルタまたはベース フィルタと同じになるように設定する必要があります。これにより、クエリ拡張モジュールは、ユーザーがファセットの適用を開始する前に最初に表示するのと同じ広範なカタログ ビューに対して、クエリの可能性を評価します。

エンドツーエンドの検索とクエリ拡張のプロセス フロー

検索リクエストが行われると、いくつかの並列プロセスが発生します。

  • リクエストを受信: API は、クエリ、メインの filtercanonical_filter を含む検索リクエストを受信します。

  • クエリ拡張決定検索: 並行して、クエリ拡張決定モジュールは、正規のフィルタと組み合わせたクエリを使用して独自の内部検索を実行します。

  • 結果数のチェック: モジュールは、内部検索から返された商品の数を確認します。

    • 結果が 5 件以上の場合: クエリ拡張はトリガーされません。標準の検索結果は、最終的なフィルタリング ステップに進みます。
    • 結果が 5 件未満の場合: クエリ拡張がトリガーされます。モデルは、関連商品を検索するためにクエリを体系的に緩めます。たとえば、Google Pixel 5、Google Pixel 4、Google Pixel Buds、Samsung スマートフォンなどを検出できます。
  1. 最終フィルタリング: 商品セット(元のセットまたはクエリ拡張で拡張されたセット)が最終ステージに渡されます。この場合、ビジネスルールとユーザーが選択したファセットを含む最上位のフィルタが厳密に適用されます。
  • レスポンスが送信された: フィルタリングされた商品の最終リストが API レスポンスで返されます。

選択的クエリ拡張のアクティベーションの高度なユースケース

フィルタを戦略的に構成して、カタログの特定の部分でクエリ拡張を有効または無効にできます。

食料品、家電製品、ファッション アパレルを含む大規模なカタログのシナリオを考えてみましょう。このようなシナリオでは、次の点を考慮する必要があります。

目標

見つけにくい食料品や希少な食料品のクエリに対してはクエリ拡張を有効にするが、電子機器やファッション アイテムに対しては結果をゼロにする。ここでは、食料品の部分でのみクエリ拡張を有効にする必要があります。

構成

このユースケース シナリオでは、選択的クエリ拡張を次のように構成できます。

  • canonical_filter: ブロードに設定します。すべてのカテゴリ(食料品、家電、ファッション)と、在庫状況などの基本ルールを含める必要があります(category="groceries" OR category="electronics" OR category="fashion") AND inStock=TRUE で正規フィルタを定義します)。
  • filter: ユーザーのコンテキストに基づいて narrow に設定します。食料品セクションのユーザーの場合、フィルタは category="groceries" AND inStock=TRUE になります。

仕組み

このシナリオでは、選択的クエリ拡張は次のように機能します。

  • ユーザーが「iPhone 20」を検索した場合: クエリ拡張モジュールは広範な canonical_filter を使用して、既存の iPhone モデル(5 件未満の結果)を見つけ、クエリ拡張をトリガーしないと判断します。標準の検索結果(既存の iPhone)はメインフィルタに渡され、category="electronics"category="groceries" と一致しないため、ブロックされます。ユーザーには結果が 0 件と正しく表示されます。
  • ユーザーが「高タンパク質糖尿病ミルク」を検索した場合: クエリ拡張モジュールは広範な canonical_filter を使用して 5 件未満の結果を見つけ、関連する乳製品を見つけることでクエリ拡張をトリガーします。これらの商品はメインフィルタに渡されます。category="groceries" と一致するため、これらの商品はユーザーに正常に返却されます。

canonical_filter(意思決定ビュー)とメインの filter(最終出力ビュー)のスコープを操作することで、検索エクスペリエンスを正確に制御できます。

データセットの例

このページでは、次のデータセットを例として使用します。展開すると、サンプル商品紹介データセット内のフィールドが表示されます。

プロダクト データセットの例

ID title brands categories price_info.price
「nest_mini_2nd_gen」 「Nest Mini(第 2 世代)」 ["Google", "Nest"] ["Nest > speakers and displays"] 49.00
「nest_audio」 「Nest Audio」 ["Google", "Nest"] ["Nest > speakers and displays"] 99.99
「nest_hub_max」 「Nest Hub Max」 ["Google", "Nest"] ["Nest > speakers and displays"] 229.00
「nest_hub」 「Nest Hub」 ["Google", "Nest"] ["Nest > speakers and displays"] 88.99
「google_home_max」 「Google Home Max」 ["Google", "Nest"] ["Nest > speakers and displays"] 299.00
「google_home_mini」 「Google Home Mini」 ["Google", "Nest"] ["Nest > speakers and displays"] 49.00
「google_pixel_5」 「Google Pixel 5」 ["Google", "Pixel"] ["Pixel > phones"] 699.00
「5G 版 google_pixel_4a」 「5G 版 Google Pixel 4a」 ["Google", "Pixel"] ["Pixel > phones"] 499.00
「google_pixel_4a」 「Google Pixel 4a Phones」 ["Google", "Pixel"] ["Pixel > phones"] 349.00
「google_pixel_stand」 「Google Pixel Stand」 ["Google", "Pixel"] ["Pixel > featured accessories"] 79.00
「google_pixel_buds」 「Google Pixel Buds」 ["Google", "Pixel"] ["Pixel > featured accessories"] 179.00
「google_pixel_5_case」 「Google Pixel 5 ケース」 ["Google", "Pixel"] ["Pixel > featured accessories"] 40.00
「google_pixel_4a (5G)_case」 「Google Pixel 4a (5G) ケース」 ["Google", "Pixel"] ["Pixel > featured accessories"] 40.00
「google_pixel_4a_case」 「Google Pixel 4a ケース」 ["Google", "Pixel"] ["Pixel > featured accessories"] 40.00

クエリ拡張

クエリ拡張によって、特にロングテール クエリの場合は、結果が少ないクエリ キーワードの取り消しが増加します。

この検索機能は、クエリ拡張条件を決定する仕様によって駆動されます。デフォルトでオフになっている pinUnexpandedResults オプションが含まれています。true に設定すると、拡張されていない商品が検索結果の先頭に表示されます。上位の結果の後に、展開された結果が表示されます。

Java

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

public static void searchProductsWithQueryExpansion(String query, int pageSize,
    Condition condition) throws IOException, InterruptedException {
  QueryExpansionSpec queryExpansionSpec = QueryExpansionSpec.newBuilder()
      .setCondition(condition)
      .build();

  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setQueryExpansionSpec(queryExpansionSpec)
      .build();

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

たとえば、クエリ拡張を使用せずに Google Pixel 5 を検索すると、結果は google_pixel_5 ID に限定されます。ただし、クエリ拡張を使用すると、商品紹介の例のデータセットgoogle_pixel_4a_with_5ggoogle_pixel_4agoogle_pixel_5_case の ID も取得される可能性があります。