Esta es la documentación de Recomendaciones IA, Retail Search y la nueva consola de venta minorista. Para usar Retail Search en la fase restringida de Google Analytics, comuníquese con el equipo de Ventas de Cloud.

Si solo usas Recomendaciones IA, permanece en la consola de Recomendaciones y consulta la documentación de Recomendaciones IA.

Filtra y ordena los resultados

En esta página, se describe el filtrado y el ordenamiento con la búsqueda de venta minorista.

Conjunto de datos de ejemplo

En esta página, se usa el siguiente conjunto de datos como ejemplo. Solo se incluyen los campos necesarios para el ejemplo.

Filtro

Java

public static SearchResponse searchFilteredProducts(String query, int pageSize,
    String filter) throws IOException, InterruptedException {
  SearchServiceClient searchClient = getSearchServiceClient();

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

  SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();

  searchClient.shutdownNow();
  searchClient.awaitTermination(2, TimeUnit.SECONDS);

  return response;
}

Se puede resumir la sintaxis de la expresión de filtro con la siguiente EBNF:

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

  # A expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
                    # A parenthesized expression
                    | "(", expression, ")"
                    # A simple expression applying to a textual field.
                    # Function "ANY" returns true if the field contains any of the literals.
                    ( textual_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 applying 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.
  # Specify inclusive bound with character 'i' for inclusive or exclusive bound
  # with character 'e', explicitly.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";

  # An upper_bound is either a double, or "*" which represents infinity.
  # Specify inclusive bound with character 'i' for inclusive or exclusive bound
  # with character 'e', explicitly.
  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;

  textual_field = see the table below;

  numerical_field = see the table below;

Los campos de texto admitidos se resumen en la siguiente tabla.

Campo description
"productId" El ID del producto (el último segmento de Product.name).
“marcas” El atributo Product.Brands.
"categories" The Product.categories.
"genders" The Audience.genders.
"ageGroups" The Audience.age_groups.
“disponibilidad” El atributo Product.availability. El valor es uno de los siguientes: "IN_STOCK", "OUT_OF_STOCK" "PREORDER" o "BACKORDER".
“colorFamilies” El atributo ColorInfo.color_families.
"colors" The ColorInfo.colors.
"sizes" Los Producto.tamaños
"materials" El atributo Product.materials.
"patterns" El atributo Product.patrones.
"conditions" El atributo Product.condition.
“attributes.key” El atributo personalizado textual en el objeto Product. La clave puede ser cualquier clave en el mapa Product.attributes, si los valores de atributos son textuales.
"pickupInStore" El atributo FulfillmentInfo.place_ids para el tipo “pick-in-store”.
"shipToStore" El atributo FulfillmentInfo.place_ids para el tipo “ship-to-store”.
"sameDayDelivery" El atributo FulfillmentInfo.place_ids para el tipo “same-day-Delivery”.
"nextDayDelivery" El atributo FulfillmentInfo.place_ids para el tipo “Next-day-Delivery”.
"customFulfillment1" El atributo FulfillmentInfo.place_ids para el tipo “custom-type-1”.
"customFulfillment2" El atributo FulfillmentInfo.place_ids para el tipo “custom-type-2”.
"customFulfillment3" El atributo FulfillmentInfo.place_ids para el tipo “custom-type-3”.
"customFulfillment4" El atributo FulfillmentInfo.place_ids para el tipo “custom-type-4”.
"customFulfillment5" El atributo FulfillmentInfo.place_ids para el tipo “custom-type-5”.
“inventory(place_id,attributes.key)” El atributo personalizado de texto en inventario.

Los campos numéricos compatibles se resumen en la siguiente tabla.

Campo description
"price" The PriceInfo.price.
"discount" El descuento Calculado por (original_price - price) / original_price.
"rating" The Rating.average_rating.
"ratingCount" The Rating.rating_count.
“attributes.key” El atributo numérico personalizado del objeto Product. La clave puede ser cualquier clave en el mapa Product.attributes, si los valores del atributo son numéricos.
“inventory(place_id,price)” Es el precio del inventario.
“inventory(place_id,attributes.key)” El atributo personalizado numérico del inventario.

La cantidad máxima de expresiones unidas por “AND” es 20. La cantidad máxima de expresiones simples unidas por "OR" es 10. La cantidad máxima de literales en la función “ANY” es 100.

Por ejemplo, para buscar un producto de Google en las siguientes situaciones, respectivamente, puedes establecer query como “Google” y filter como los valores que se muestran en la siguiente tabla:

situación filtro
no es un adaptador de Pixel “NO pertenecen a categorías: ANY(\“Pixel > Accesorios destacados\”)”
“más económico de 100 dólares” “precio: IN(*, 100.0e)”
“Parlante Nest a menos de 80 dólares” “(categorías: ANY(\“Nest > altavoces y pantallas\”)) AND (precio: IN(80.0i, *))”

Ordenar

Java

public static SearchResponse searchOrderedProducts(String query, int pageSize,
    String orderBy) throws IOException, InterruptedException {
  SearchServiceClient searchClient = getSearchServiceClient();

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

  SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();

  searchClient.shutdownNow();
  searchClient.awaitTermination(2, TimeUnit.SECONDS);

  return response;
}

Los campos ordenables admitidos se resumen en la siguiente tabla.

Campo description
"productId" El ID del producto (el último segmento de Product.name).
"title" The Product.title.
“marcas” El atributo Product.Brands.
"categories" The Product.categories.
"genders" The Audience.genders.
"ageGroups" The Audience.age_groups.
"price" The PriceInfo.price.
"discount" El descuento Calculado por (precio_original - precio) / precio.
"rating" The Rating.average_rating.
"ratingCount" The Rating.rating_count.
“attributes.key” El atributo personalizado del objeto Product. La clave puede ser cualquier clave en el mapa Product.attributes.
“inventory(place_id,price)” Es el precio del inventario.
“inventory(place_id,attributes.key)” El atributo personalizado numérico o textual en el inventario.

De forma predeterminada, el orden es ascendente. El orden descendente se puede especificar mediante el sufijo "desc", como "rating desc".

El orden de múltiples campos se admite mediante el uso de campos separados por comas en orden de prioridad. Los campos de prioridad más baja se usarán a fin de ordenar elementos con valores iguales para campos de prioridad más alta. Por ejemplo, "rating desc, price" ordenaría elementos con la misma calificación por precio.