Esta es la documentación de Recomendaciones IA, Retail Search y la nueva consola de Retail.

Filtrar y ordenar los resultados

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

Instructivo de filtrado

En este instructivo, se muestran algunos ejemplos de filtrado de productos.


Para obtener orientación paso a paso directamente sobre esta tarea directamente en el editor de Cloud Shell, haz clic en Guiarme:

Guiarme


En las siguientes secciones, se explican los mismos pasos que cuando se hace clic en Guiarme.

Instructivo de ordenamiento

En este instructivo, se explica cómo ordenar elementos en una respuesta de búsqueda.


Para obtener orientación paso a paso directamente sobre esta tarea directamente en el editor de Cloud Shell, haz clic en Guiarme:

Guiarme


En las siguientes secciones, se explican los mismos pasos que cuando se hace clic en Guiarme.

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" El atributo Product.sizes.
"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.
&inventario;inventario(place_id,precio_original)" Es el precio del inventario original.
“inventory(place_id,attributes.key)” El atributo personalizado numérico del inventario.

Se permite un máximo de 10 conjunciones o disyunciones anidadas.

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 (original_price - price) / price.
"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.
&inventario;inventario(place_id,precio_original)" Es el precio del inventario original.
“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".

En el caso de un campo numérico con valores múltiples, por ejemplo, un campo repetido o un campo establecido para variantes de productos, el valor mínimo se usa para ordenar por orden ascendente y el valor máximo se usa para ordenar por orden descendente.

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 usan para ordenar los elementos con valores iguales para los campos de mayor prioridad. Por ejemplo, &desct;rating desc, price" pide elementos con la misma calificación por precio.