Filtra y ordena los resultados

En esta página, se describe cómo filtrar y ordenar los resultados de la búsqueda.

Instructivo de filtrado

En este instructivo, se muestra la función de filtrado. Te permite ajustar mejor las solicitudes de búsqueda según tus necesidades o las del cliente. Puedes filtrar por uno o varios campos, por campos de texto o numéricos, o ambos. Puedes usar un lenguaje de expresión a fin de construir un predicado para cada campo o combinar diferentes expresiones mediante operadores lógicos. Por ejemplo, un comprador que busca calzado puede usar filtros para limitar su búsqueda a su marca y color preferidos.


Para seguir la guía paso a paso sobre esta tarea directamente en el editor de Cloud Shell, haz clic en Guiarme:

Guiarme


Instructivo de ordenamiento

En este instructivo, se muestra cómo ordenar elementos en una respuesta de búsqueda. Cuando un usuario final busca un producto en tu sitio, puede ver resultados ordenados por varios campos. Por ejemplo, un usuario busca un vestido con el mejor precio y descuento. El precio y el descuento son varios campos aquí. El usuario verá los vestidos ordenados por precio y, en el caso de los vestidos que tienen el mismo precio, ordenados por descuento.


Para seguir la guía paso a paso sobre esta tarea directamente en el editor de Cloud Shell, haz clic en Guiarme:

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

import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;

public static void searchFilteredProducts(String query, int pageSize,
    String filter) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setFilter(filter)
      .build();

  try (SearchServiceClient searchClient = SearchServiceClient.create()) {
    SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();
    System.out.println("Search response: " + searchResponse);
  }
}

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

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

  # Expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
    # A parenthetical expression.
    | "(", expression, ")"
    # A simple expression applying to a text field.
    # Function "ANY" returns true if the field contains any of the literals.
    ( text_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 that applies 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.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";

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

  text_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.
"inventory(place_id,original_price)" Es el precio del inventario original.
"inventory(place_id,attributes.key)" El atributo personalizado numérico del inventario.

Se permiten 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, *))”

Pedidos

Java

import com.google.cloud.retail.v2.SearchRequest;
import com.google.cloud.retail.v2.SearchResponse;
import com.google.cloud.retail.v2.SearchServiceClient;

public static void searchOrderedProducts(String query, int pageSize,
    String orderBy) throws IOException, InterruptedException {
  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setOrderBy(orderBy)
      .build();

  try (SearchServiceClient searchClient = SearchServiceClient.create()) {
    SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();
    System.out.println("Search response: " + searchResponse);
  }
}

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.
"inventory(place_id,original_price)" 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 con el sufijo "desc", como "rating desc".

En el caso de un campo numérico con varios valores, como un campo repetido o un campo configurado para productos de variantes, 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 menor prioridad se usan para ordenar los elementos con valores iguales para los campos de mayor prioridad. Por ejemplo, "rating desc, precio" ordena los elementos con la misma calificación por precio.