查询扩展

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

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

教程:查询扩展

本教程介绍了如何启用查询扩展功能。如果买家使用含义模糊或包含多个字词的搜索短语,可能会收到空响应。开启查询扩展功能后,系统会分析请求,并返回根据解析的搜索查询扩展的商品列表。


如需遵循有关此任务的分步指导,请直接在 Cloud Shell Editor 中点击操作演示

操作演示


查询扩展概览

查询扩展是一项强大的功能,旨在提高搜索召回率,防止出现零结果情况,尤其是在用户查询长尾或复杂内容时。

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

查询扩展的关键应用场景包括:

  • 长尾查询:对于高度具体的搜索查询(例如糖尿病患者专用高蛋白低脂有机牛奶),目录中可能没有完全匹配的结果。查询扩展功能可以返回与部分意图匹配的商品,例如标有“适合糖尿病患者饮用的牛奶”“高蛋白牛奶”等属性或属性值的商品。
  • 替代商品:如果用户搜索的品牌或商品不在目录中(例如 Starbucks coffee 100ml),查询扩展功能可以建议可供购买的替代咖啡品牌,从而避免搜索无果。

以下部分将重点介绍 Vertex AI Search for Commerce 中的查询扩展功能,包括其功能、触发机制和配置细微差别,并特别强调规范过滤条件的关键作用。

查询扩展触发机制

是否启用查询扩展功能或给定的搜索查询由系统自动决定,并基于可快速配置的规范过滤规则。

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

了解顶级过滤条件和规范过滤条件之间的区别

为了正确实现查询扩展,务必要了解搜索请求中的两个主要过滤条件参数。

  • 顶级过滤条件 (filter):这是应用于搜索结果的主要过滤条件,在将结果返回给用户之前应用。它是两个潜在层的组合:

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

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

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

核心规范过滤函数

规范过滤器的设计目的是区分自然搜索效果不佳的搜索结果和用户有意缩小的结果集。

场景 1

  • 用户体验历程:用户搜索 t-shirt,获得数千条结果。有一个默认的 business_filter,例如,它仅过滤有库存的商品以及与自定义商店级属性匹配的商品。然后,用户应用了 brand="Adidas" 和 size="L" 的分面过滤条件,这使得结果数量减少到两个。
  • 如果 canonical_filterfilter 相同:查询扩展决策系统将仅看到 2 个结果,并错误地触发查询扩展,显示相关但不相关的产品,例如 Nike T 恤,这会违背用户的明确过滤条件。
  • 正确的设置是 canonical_filter = business filter:应根据初始查询(不包括用户选择的方面)做出查询扩展决策。

场景 2

  • 用户体验历程:用户搜索 adidas t-shirt with black graphic prints,但只获得一两个结果(如果有)。默认值为 business_filter,例如,它仅过滤有货商品和与自定义商店级属性匹配的商品。
  • 如果未设置 canonical_filter 或未正确配置,则使用规范过滤条件的搜索可能会找到与查询匹配但缺货或来自其他商店(即自定义商店级属性的值不同)的产品。在这种情况下,不会触发查询扩展。
  • 正确的设置是 canonical_filter = business filter。如果查询扩展决策发现给定长查询的商品数量少于 3 件,则会触发查询扩展,并为原始查询带来相关商品,即有货且与商店级属性匹配的商品。这样一来,搜索结果就会扩展到包括其他品牌的黑色图案印花 T 恤、其他颜色的图案印花 T 恤,或者搜索查询中提及的品牌的其他 T 恤产品。

查询扩展最佳实践

规范过滤条件应几乎总是设置为与您的商家过滤条件或基本过滤条件相同。这样可确保查询扩展模块根据用户在开始应用过滤条件之前最初看到的相同广泛目录视图来评估查询的潜力。

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

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

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

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

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

    • 如果结果数量为 5 个或更多:系统不会触发查询扩展。标准搜索结果会进入最终过滤步骤。
    • 如果结果少于 5 个:系统会触发查询扩展。模型会系统性地放宽查询条件,以查找相关商品。例如,该模型可能会查找 Pixel 5 手机、Pixel 4 手机、Pixel 耳机,甚至 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 (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 with 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 Case" ["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 Case" ["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。