Filtrer et trier les résultats

Cette page décrit le filtrage et l'ordre de tri à l'aide de la recherche.

Appliquer un filtre

Ce tutoriel présente la fonctionnalité de filtrage. Il vous permet d'affiner les requêtes de recherche en fonction de vos besoins ou de ceux de vos clients. Vous pouvez filtrer selon un ou plusieurs champs, des champs textuels ou numériques, ou les deux. Vous pouvez utiliser un langage d'expression pour construire un prédicat pour chaque champ ou combiner différentes expressions à l'aide d'opérateurs logiques. Par exemple, un acheteur à la recherche de chaussures peut utiliser des filtres pour affiner sa recherche en fonction de la marque et de la couleur de son choix.


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

Visite guidée


Trier les produits

Ce tutoriel explique comment trier les articles dans une réponse de recherche. Lorsqu'un utilisateur final recherche un produit sur votre site, les résultats s'affichent dans l'ordre selon plusieurs champs. Par exemple, un utilisateur recherche une robe offrant le meilleur prix et la meilleure remise. Le prix et la remise sont des champs multiples ici. L'utilisateur verra les robes classées par prix, et les robes au même prix, classées par remise.


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

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.

Filtre

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

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

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.

Un maximum de 10 conjonctions ou disjonctions imbriquées sont autorisé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, *))"

Commande

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

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 le suffixe "desc", par exemple "rating desc".

Pour un champ numérique comportant plusieurs valeurs (par exemple, un champ répété ou un champ défini pour des variantes de produits), la valeur minimale est utilisée pour le tri par ordre croissant, et la valeur maximale pour le tri par ordre décroissant.

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 de valeurs égales dans les champs de priorité supérieure. Par exemple, "rating desc, price" permet de classer les articles ayant la même note par prix.