查询扩展

查询扩展是指在最初未找到任何结果或找到的结果太少时,逐步放宽查询限制以纳入更多结果。这会导致每次查询的结果数量发生调整。

如果查询没有相关文档,查询扩展会返回相关性较低的文档,以确保不会返回零条搜索结果。

动态分面投放 控制 不同,查询扩展 无法直接在 Google Cloud 控制台中配置。您需要针对每个搜索请求以编程方式配置查询扩展。请继续阅读 ,了解如何在 API 中配置查询扩展

教程:查询扩展

本教程介绍了如何启用查询扩展功能。当购物者使用模糊或多字词搜索短语时,可能会收到空响应。启用查询扩展后,系统会分析请求,并根据解析后的搜索查询返回扩展后的产品列表。

查询扩展概览

查询扩展是一项强大的功能,旨在提高搜索召回率并避免出现零结果的情况,尤其适用于长尾或复杂的用户查询。

如果产品目录中没有完全匹配项,查询扩展会识别并显示相关或替代产品,而不是返回零条结果。这不仅能改善用户体验,还能提高转化率。

查询扩展的主要应用场景包括:

  • 长尾查询:对于高度具体的搜索(例如“diabetic high-protein low-fat organic milk”),目录中可能没有完全匹配项。查询扩展可以返回与部分意图匹配的产品,例如标有“diabetic-friendly milk”或“high-protein milk”属性或属性值的产品。
  • 替代产品:如果用户搜索的品牌或产品不在目录中(例如“Starbucks coffee 100ml”),查询扩展可以推荐可供购买的替代咖啡品牌,避免搜索无果。

接下来的部分将介绍 AI Commerce Search 中查询扩展功能的功能、触发机制和配置细微差别,并重点介绍 规范化过滤器 的关键作用。

查询扩展触发机制

是否激活查询扩展或给定搜索查询的决定是自动做出的,并且基于可快速配置的规范化过滤器规则。

  • 触发条件:只有当使用规范化过滤器查询进行的初始搜索产生的产品结果少于 3 个时,才会触发查询扩展。
  • 阈值:默认情况下,此阈值为 3,但可以更改。它适用于大多数电子商务应用场景,可确保仅当初始结果集确实稀疏时才激活查询扩展。

在 API 中配置查询扩展

查询扩展是使用 API 以编程方式针对每个请求进行配置的,如下所示:

  • API 配置:您可以通过在 SearchRequest 中添加 queryExpansionSpec 对象来控制查询扩展。

  • 设置:在 queryExpansionSpec 中,您可以将 condition 字段设置为 AUTO 以启用该功能,或设置为 DISABLED 以将其关闭(如果未指定,则为默认值)。

  • 固定:您可以选择在请求中将 pinUnexpandedResults 设置为 true,以确保原始查询的完全匹配项显示在搜索结果的顶部,然后才是扩展后的结果。如需了解详情,请参阅固定页面。

配置规范化过滤器

为了使查询扩展能够有效触发,您必须在搜索请求中正确配置 canonical_filter

如需正确实现查询扩展,务必要了解搜索请求中的两个主要过滤器参数:顶级过滤器和规范化过滤器。

  • 顶级过滤器 (filter) :这是应用于搜索结果的主要过滤器,用户在收到搜索结果之前会看到经过此过滤器的结果。它是两个潜在层的组合:

    • 业务/基本过滤器:应用于所有搜索的预定义规则,通常无需直接用户输入,例如 inStock=TRUE, category="groceries", storeId="XYZ"

    • 用户选择的分面过滤器:用户在与搜索界面互动时动态应用的过滤器,例如选择“brand="Adidas", size="L"”的分面过滤器。

  • 规范化过滤器 (canonical_filter) :这是一种专用过滤器,仅供查询扩展决策模块使用。它的唯一作用是定义目录视图,系统会根据该视图评估查询扩展触发条件(结果少于 5 个)。

核心规范化过滤器函数

规范化过滤器旨在区分自然搜索结果不佳和用户有意缩小范围的结果集。它可以很宽泛,以排除业务逻辑来考虑用户应用的分面过滤器;也可以很狭窄,以便在需要时触发查询扩展,具体取决于用户场景。

场景 1

  • 用户体验历程:用户搜索“t-shirt”,并获得数千条结果。有一个默认的 business_filter,例如,它仅过滤有货的产品以及与自定义商店级属性匹配的产品。然后,用户应用“brand="Adidas" and size="L"”的分面过滤器,这会将结果数减少到 2 个。
  • 如果将 canonical_filter 设置为包含 与 filter 相同的条件(例如 AVAILABILITY: IN_STOCK AND color: "Red"),查询扩展决策系统将仅看到 2 个结果,并错误地 触发查询扩展,向用户提供相关但无关的 产品(例如 Nike T 恤),从而破坏用户明确的 过滤条件。
  • 正确的设置是 canonical_filter = business filter。查询扩展决策应基于初始查询做出,不包括用户选择的分面。通过保持 canonical_filter 的宽泛性,系统可以正确识别 目录中有大量匹配的产品,从而尊重用户的严格过滤条件,而不会强制进行扩展。

场景 2

  • 用户体验历程:用户搜索“adidas t-shirt with black graphic prints”,如果存在匹配项,则只会产生一两个结果。有一个默认的 business_filter,例如,它仅过滤有货的产品以及与自定义商店级属性匹配的产品。
  • 如果未设置 canonical_filter 或未正确配置,则使用规范化过滤器进行的搜索可能会找到与查询匹配但缺货或来自不同商店的产品,这意味着自定义商店级属性的值不同。在这种情况下,不会触发查询扩展。
  • 正确的设置是 canonical_filter = business filter。使用此设置,查询扩展 决策会针对给定的长查询找到少于 3 个产品, 然后触发查询扩展,并将相关产品带到 原始查询中,这意味着与商店级 属性匹配的有货产品。这会将搜索结果扩展为包含来自不同品牌的黑色图形 印花 T 恤、其他颜色的图形 印花 T 恤,或来自查询品牌的其他 T 恤产品。 为此 canonical_filter 用例添加业务限制。

查询扩展最佳实践

规范化过滤器应几乎始终设置为与您的业务或基本过滤器相同。这可确保查询扩展模块根据用户最初看到的相同宽泛目录视图来评估查询的潜力,然后再开始应用分面。

端到端搜索和查询扩展流程

发出搜索请求时,会发生多个并行进程:

  • 收到请求:API 收到包含查询、主要 filtercanonical_filter 的搜索请求。

  • 查询扩展决策搜索:同时,查询扩展决策模块使用查询与规范化过滤器相结合执行自己的内部搜索。

  • 结果数检查 :该模块会检查其内部搜索返回的产品数量。

    • 如果结果为 5 个或更多:则 不会 触发查询扩展。标准搜索结果会进入最终过滤步骤。
    • 如果结果少于 5 个:则触发查询扩展。该模型会系统地放宽查询条件,以查找相关产品。例如,该模型可能会找到“Pixel 5 phone”“Pixel 4 phones”“Pixel earbuds”,甚至是 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" 不匹配。用户正确地看到零条结果。
  • 用户搜索“high-protein diabetic milk”:* 查询扩展模块使用宽泛的 canonical_filter,找到的结果少于 5 个,因此会触发查询扩展,找到相关的牛奶产品。这些产品会传递给主要过滤器。由于它们与 category="groceries" 匹配,因此这些产品会成功返回给用户。

通过操纵 canonical_filter(决策视图)和主要 filter(最终输出视图)的范围,您可以精确控制搜索体验。

示例数据集

本页以下面的数据集为例。展开该数据集,查看示例产品说明数据集中的字段。

商品数据集示例

ID title brands categories price_info.price
"nest_mini_2nd_gen" "Nest Mini (2nd gen)" ["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
"google_pixel_4a_with_5g" Google Pixel 4a 5G 版 ["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) Case" ["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 在示例产品说明数据集中获得。