Filtrer et trier les résultats

Cette page décrit le filtrage et le tri avec 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 les résultats selon un ou plusieurs champs, des champs textuels ou numériques, ou les deux. Vous pouvez utiliser un langage d'expression afin de construire un prédicat pour chaque champ ou combiner différentes expressions à l'aide d'opérateurs logiques. Par exemple, un consommateur qui recherche des chaussures peut utiliser des filtres pour affiner sa recherche en fonction de la marque et de la couleur qu'il préfère.


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 organiser les articles dans une réponse de recherche. Lorsqu'un utilisateur final recherche un produit sur votre site, il voit les résultats classés selon plusieurs champs. Par exemple, un utilisateur recherche une robe au meilleur prix et au meilleur prix. Les champs "Prix" et "Remise" comportent plusieurs champs. L'utilisateur verra les robes triées par prix, et pour celles de même prix, 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.

Filter

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.

Vous ne pouvez pas utiliser plus de 10 conjonctions 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, *))"

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 "desc" d'un suffixe (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 les 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 sont utilisés pour organiser les articles avec des valeurs égales pour les champs de priorité supérieure. Par exemple, "rating desc, price" commande les articles ayant la même note en fonction de leur prix.