クエリ拡張

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

クエリに関連するドキュメントがない場合、クエリ拡張は関連性の低いドキュメントを返して、検索結果がゼロにならないようにします。

たとえば、動的ファセットサービング コントロールとは異なり、クエリ拡張 はコンソールで直接構成できません。 Google Cloud 代わりに、検索リクエストごとにクエリ拡張をプログラムで構成する必要があります。API でクエリ拡張を構成する方法については、以下をご覧ください 。

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

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


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

ガイドを表示


クエリ拡張の概要

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

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

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

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

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

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

クエリ拡張を有効にするかどうかは、自動的に判断されます。この判断は、すぐに構成可能な正規フィルタルールに基づいています。

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

API でクエリ拡張を構成する

クエリ拡張は、API を使用してリクエストごとにプログラムで構成します。

  • API 構成: クエリ拡張を制御するには、queryExpansionSpec オブジェクトを SearchRequest に含めます。

  • 設定: queryExpansionSpec 内で、condition フィールドを AUTO に設定して機能を有効にするか、DISABLED に設定して機能を無効にします。指定しない場合はデフォルトで無効になります。

  • 固定: リクエストで pinUnexpandedResultstrue に設定すると、元のクエリに完全に一致する結果が検索結果の上部に表示され、その後に拡張された結果が表示されます。詳細については、固定のページをご覧ください。

正規フィルタを構成する

クエリ拡張を効果的にトリガーするには、検索リクエストで canonical_filter を正しく構成する必要があります。

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

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

    • ビジネス/ベース フィルタ: すべての検索に適用される事前定義されたルール。多くの場合、ユーザー入力なしで適用されます(inStock=TRUE, category="groceries", storeId="XYZ" など)。

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

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

正規フィルタのコア機能

正規フィルタは、オーガニック検索の結果が少ない場合と、ユーザーが意図的に絞り込んだ結果セットとを区別するように設計されています。ユーザー シナリオに応じて、ユーザーが適用したフィルタを考慮してビジネス ロジックを除外するように広範囲に設定することも、必要に応じてクエリ拡張をトリガーするように絞り込むこともできます。

シナリオ 1

  • ユーザー ジャーニー: ユーザーが「T シャツ」を検索すると、数千件の結果が返されます。デフォルトの business_filter があり、たとえば、在庫のある商品と、カスタムの店舗レベルの属性に一致する商品のみをフィルタします。ユーザーが brand="Adidas" と size="L" のファセット フィルタを適用すると、結果の数が 2 に減ります。
  • canonical_filterfilter と同じ条件( AVAILABILITY: IN_STOCK AND color: "Red" など)を含むように設定されている場合: クエリ拡張の決定システムでは 2 件の結果しか表示されず、クエリ拡張が誤ってトリガーされ、関連するが不適切な商品(Nike の T シャツなど)がユーザーに大量に表示され、ユーザーが明示的にフィルタした内容が無視されます。
  • 正しい設定は canonical_filter = business filterです。クエリ拡張の決定は、ユーザーが選択したファセットを除き、最初のクエリに基づいて行う必要があります。 canonical_filter を広範囲に設定することで、システムはカタログに一致する商品が多数あることを正しく識別し、拡張を強制することなく、ユーザーの厳格なフィルタを尊重できます。

シナリオ 2

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

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

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

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

検索リクエストが行われると、いくつかの並行処理が行われます。

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

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

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

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

選択的なクエリ拡張の有効化の高度なユースケース

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

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

目標

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

構成

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

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

仕組み

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

  • ユーザーが「iPhone 20」を検索: クエリ拡張モジュールは広範な canonical_filter を使用して、既存の iPhone モデル(5 件未満の結果)を検索し、クエリ拡張をトリガーしないと判断します。標準の検索結果(既存の iPhone)はメインフィルタに渡されますが、category="electronics"category="groceries" と一致しないため、メインフィルタによってブロックされます。ユーザーには結果がゼロと表示されます。
  • ユーザーが「*高タンパク質糖尿病患者向けミルク」を検索:* クエリ拡張モジュールは広範な 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_4a、および google_pixel_5_case ID を サンプルの商品説明データセットでも取得できます。