Ce document concerne Recommendations AI, Retail Search et la nouvelle console Retail. Pour utiliser Retail Search dans la phase en disponibilité limitée, contactez le service commercial Cloud.

Si vous n'utilisez que Recommendations AI, restez dans la console Recommendations AI et consultez la documentation sur Recommendations AI.

Filtrer et trier les résultats

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

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.

Filtre

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,attributes.key)" Attribut personnalisé numérique dans l'inventaire.

Le nombre maximal d'expressions associées par l'opérateur "AND" est de 20. Le nombre maximal d'expressions simples associées à l'aide de l'opérateur "OR" est de 10. Le nombre maximal de littéraux autorisé dans la fonction "ANY" est de 100.

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,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 sont utilisés pour trier les éléments ayant des valeurs égales pour les champs de priorité supérieure. Par exemple, "rating desc, price" permet de trier les articles ayant la même note en fonction de leur prix.