Ce document concerne Recommendations AI, Retail Search et la nouvelle console Retail.

Filtrer et trier les résultats

Cette page décrit le filtrage et le tri avec Retail Search.

Tutoriel sur le filtrage

Ce tutoriel présente des exemples de filtrage de produits.


Pour obtenir des conseils détaillés sur cette tâche directement dans l'éditeur Cloud Shell, cliquez sur Visite guidée :

Visite guidée


La procédure décrite dans les sections suivantes, est la même que si vous cliquez sur Visite guidée.

Trier les produits

Ce tutoriel vous explique comment trier les articles dans une réponse de recherche.


Pour obtenir des conseils détaillés sur cette tâche directement dans l'éditeur Cloud Shell, cliquez sur Visite guidée :

Visite guidée


La procédure décrite dans les sections suivantes, est la même que si vous cliquez sur Visite guidée.

Exemple d'ensemble de données

Cette page utilise l'ensemble de données suivant comme exemple. Seuls les champs nécessaires à l'exemple sont inclus.

Filtrer

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;
}

La syntaxe de l'expression de filtre peut être résumée au format EBNF comme suit :

  # 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;

Le tableau suivant récapitule les champs textuels acceptés.

champ description
"productId" Identifiant du produit (dernier segment de Product.name).
"chaînes" Champ Product.brands.
"categories" Champ Product.categories.
"genders" Champ Audience.genders.
"ageGroups" Champ Audience.age_groups.
"availability" Champ Product.availability La valeur peut être "IN_STOCK" (en stock), "OUT_OF_STOCK" (non disponible), "PREORDER" (en précommande) ou "BACKORDER" (en cours de réapprovisionnement).
"colorFamilies" Champ ColorInfo.color_families.
"colors" Champ ColorInfo.colors.
"sizes" Champ Product.sizes.
"materials" Champ Product.materials.
"patterns" Champ Product.patterns.
"conditions" Champ Product.conditions.
"attributes.key" Attribut de texte personnalisé dans l'objet Product. La clé peut être n'importe quelle clé du champ Product.attributes si les valeurs des attributs sont textuelles.
"pickupInStore" Identifiant FulfillmentInfo.place_ids du type "pickup-in-store".
"shipToStore" Identifiant FulfillmentInfo.place_ids du type "ship-to-store".
"sameDayDelivery" Identifiant FulfillmentInfo.place_ids du type "same-day-delivery".
"nextDayDelivery" Identifiant FulfillmentInfo.place_ids du type "next-day-delivery".
"customFulfillment1" Identifiant FulfillmentInfo.place_ids du type "custom-type-1".
"customFulfillment2" Identifiant FulfillmentInfo.place_ids du type "custom-type-2".
"customFulfillment3" Identifiant FulfillmentInfo.place_ids du type "custom-type-3".
"customFulfillment4" Identifiant FulfillmentInfo.place_ids du type "custom-type-4".
"customFulfillment5" Identifiant FulfillmentInfo.place_ids du type "custom-type-5".
"inventory(place_id,attributes.key)" Attribut personnalisé textuel dans l'inventaire.

Le tableau suivant récapitule les champs numériques acceptés.

champ description
"price" Champ PriceInfo.price.
"discount" Remise. Calculée avec la formule (original_price - price) / original_price.
"rating" Champ Rating.average_rating.
"ratingCount" Champ Rating.rating_count.
"attributes.key" Attribut numérique personnalisé dans l'objet "Product". La clé peut être n'importe quelle clé du champ Product.attributes si les valeurs des attributs sont numériques.
"inventory(place_id,price)" Prix de l'inventaire.
"inventory(place_id,original_price)" Prix d'inventaire d'origine.
"inventory(place_id,attributes.key)" Attribut personnalisé numérique dans l'inventaire.

Vous pouvez utiliser au maximum 10 disjonctions ou disjonctions imbriquées.

Par exemple, pour rechercher un produit Google dans les situations suivantes, vous pouvez respectivement définir query sur "Google" et filter sur les valeurs affichées dans le tableau suivant :

scénario filter
pas un accessoire Pixel "NOT categories: ANY(\"Pixel > accessoires associés\")"
"moins de 100 dollars" "price: IN(*, 100.0e)"
"Enceinte Nest coûtant au moins 80 dollars" "(catégories: ANY(\"Nest > enceintes et écrans\")) AND (prix: IN(80.0i, *))"

Order

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;
}

Le tableau suivant récapitule les champs pouvant être triés qui sont acceptés.

champ description
"productId" Identifiant du produit (dernier segment de Product.name).
"title" Champ Product.title.
"chaînes" Champ Product.brands.
"categories" Champ Product.categories.
"genders" Champ Audience.genders.
"ageGroups" Champ Audience.age_groups.
"price" Champ PriceInfo.price.
"discount" Remise. Calculée avec la formule (original_price - price) / price.
"rating" Champ Rating.average_rating.
"ratingCount" Champ Rating.rating_count.
"attributes.key" Attribut personnalisé dans l'objet Product. La clé peut être n'importe quelle clé du champ Product.attributes.
"inventory(place_id,price)" Prix de l'inventaire.
"inventory(place_id,original_price)" Prix d'inventaire d'origine.
"inventory(place_id,attributes.key)" Attribut numérique ou textuel personnalisé dans l'inventaire.

Par défaut, l'ordre est croissant. L'ordre décroissant peut être spécifié par un suffixe "desc", par exemple "rating desc".

Le tri suivant plusieurs champs est autorisé par le biais d'une liste de champs séparés par une virgule et renseignés par ordre de priorité. Les champs de priorité inférieure permettent de classer les éléments dont les valeurs sont égales pour les champs de priorité supérieure. Par exemple, vous pouvez classer les articles ayant la même note pour chaque prix.