Filtrare e ordinare i risultati

Questa pagina descrive i filtri e l'ordinamento con la ricerca.

Tutorial sui filtri

Questo tutorial mostra la funzionalità di filtro. Consente di perfezionare le richieste di ricerca in base alle tue esigenze o a quelle del tuo cliente. Puoi applicare filtri in base a uno o più campi, in base a campi di testo o numerici oppure in base a entrambi. Puoi utilizzare un linguaggio di espressione per creare un predicato per ogni campo o combinare espressioni diverse mediante operatori logici. Ad esempio, un acquirente che cerca scarpe può utilizzare i filtri per restringere la ricerca al brand e al colore che preferisce.


Per seguire le indicazioni dettagliate per questa attività direttamente nell'editor di Cloud Shell, fai clic su Procedura guidata:

Procedura guidata


Tutorial sull'ordinamento

Questo tutorial mostra come ordinare gli articoli nei risultati di ricerca. Quando un utente finale cerca un prodotto sul tuo sito, vengono visualizzati i risultati ordinati in base a più campi. Ad esempio, un utente sta cercando un abito con il prezzo e lo sconto migliori. Prezzo e sconto sono più campi. L'utente vedrà gli abiti ordinati per prezzo e, per gli abiti con lo stesso prezzo, ordinati per sconto.


Per seguire le indicazioni dettagliate per questa attività direttamente nell'editor di Cloud Shell, fai clic su Procedura guidata:

Procedura guidata


Set di dati di esempio

Questa pagina utilizza il seguente set di dati come esempio. Sono inclusi solo i campi necessari per l'esempio.

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

La sintassi dell'espressione di filtro può essere riassunta dalla seguente 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;

I campi di testo supportati sono riportati nella tabella seguente.

campo description
"productId" L'ID prodotto (l'ultimo segmento di Product.name).
"brands" I Product.brands.
"categories" Le categorie Product.
"genders" La colonna Audience.genders.
"ageGroups" La colonna Audience.age_groups.
"availability" Il valore Product.availability. Il valore deve essere uno dei seguenti: "IN_STOCK", "OUT_OF_STOCK", PREORDER", "BACKORDER".
"colorFamilies" ColorInfo.color_families.
"colors" ColorInfo.colors.
"sizes" Product.sizes.
"materials" I materiali Product.materials.
"patterns" I pattern Product.
"conditions" Le condizioni del prodotto.
"attributes.key" L'attributo personalizzato di testo nell'oggetto Product. La chiave può essere qualsiasi chiave nella mappa Product.attributes, se i valori degli attributi sono di tipo testuale.
"pickupInStore" FulfillmentInfo.place_ids per il tipo "ritiro in negozio".
"shipToStore" FulfillmentInfo.place_ids per il tipo "spedizione in negozio".
"sameDayDelivery" FulfillmentInfo.place_ids per il tipo "same-day-delivery".
"nextDayDelivery" FulfillmentInfo.place_ids per il tipo "next-day-delivery".
"customFulfillment1" FulfillmentInfo.place_ids per il tipo "custom-type-1".
"customFulfillment2" FulfillmentInfo.place_ids per il tipo "custom-type-2".
"customFulfillment3" FulfillmentInfo.place_ids per il tipo "custom-type-3".
"customFulfillment4" FulfillmentInfo.place_ids per il tipo "custom-type-4".
"customFulfillment5" FulfillmentInfo.place_ids per il tipo "custom-type-5".
"inventory(place_id,attributes.key)" L'attributo personalizzato di tipo di testo nell'inventario.

I campi numerici supportati sono riassunti nella tabella seguente.

campo description
"price" Il valore PriceInfo.price.
"sconto" Lo sconto. Calcolata come (original_price - price) / original_price.
"rating" Il valore Rating.average_rating.
"ratingCount" Il valore Rating.rating_count.
"attributes.key" L'attributo personalizzato numerico nell'oggetto Product. La chiave può essere qualsiasi chiave nella mappa Product.attributes, se i valori degli attributi sono numerici.
"inventory(place_id,price)" Il prezzo dell'inventario.
"inventory(place_id,original_price)" Il prezzo dell'inventario originale.
"inventory(place_id,attributes.key)" L'attributo personalizzato numerico in Inventario.

Sono consentite al massimo 10 connessioni o disgiunzioni nidificate.

Ad esempio, per cercare un prodotto Google nelle seguenti situazioni, rispettivamente, puoi impostare query come "Google" e filter come i valori mostrati nella tabella seguente:

scenario filtro
Non è un accessorio Pixel "NON categorie: QUALSIASI(\"Pixel > accessori in evidenza\")"
"meno di 100 dollari" "price: IN(*, 100.0e)"
"Speaker Nest non più economico di 80 dollari" "(categories: ANY(\"Nest > speakers and displays\")) AND (price: IN(80.0i, *))"

Ordine

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

I campi ordinabili supportati sono riportati nella tabella seguente.

campo description
"productId" L'ID prodotto (l'ultimo segmento di Product.name).
"title" Product.title.
"brands" I Product.brands.
"categories" Le categorie Product.
"genders" La colonna Audience.genders.
"ageGroups" La colonna Audience.age_groups.
"price" Il valore PriceInfo.price.
"sconto" Lo sconto. Calcolata come (original_price - price) / price.
"rating" Il valore Rating.average_rating.
"ratingCount" Il valore Rating.rating_count.
"attributes.key" L'attributo personalizzato nell'oggetto Product. La chiave può essere qualsiasi chiave nella mappa Product.attributes.
"inventory(place_id,price)" Il prezzo dell'inventario.
"inventory(place_id,original_price)" Il prezzo dell'inventario originale.
"inventory(place_id,attributes.key)" L'attributo personalizzato numerico o di testo in Inventario.

Per impostazione predefinita, l'ordinamento è crescente. L'ordinamento decrescente può essere specificato tramite il suffisso "desc", ad esempio "rating desc".

Per un campo numerico con più valori, ad esempio un campo ripetuto o un campo impostato per le varianti dei prodotti, il valore minimo viene utilizzato per l'ordinamento in ordine crescente e il valore massimo per l'ordinamento in ordine decrescente.

L'ordinamento in base a più campi è supportato tramite l'utilizzo di campi separati da virgole in ordine di priorità. I campi con priorità più bassa vengono utilizzati per ordinare gli articoli con valori uguali per i campi con priorità più alta. Ad esempio, "rating desc, price" ordina gli articoli con la stessa valutazione in base al prezzo.