Filtrare e ordinare i risultati

Questa pagina descrive il filtraggio e l'ordinamento con la ricerca.

Il filtro semantico ottimizza l'ordinamento non predefinito

Vertex AI Search per il commercio è progettato per mostrare un'ampia varietà di risultati, inclusi articoli marginalmente pertinenti che sono popolari o di tendenza. Questo è efficace nelle ricerche predefinite (ordinate per pertinenza), ma nelle ricerche non predefinite che utilizzano la funzionalità order_by, ad esempio l'ordinamento per prezzo, gli articoli meno pertinenti possono essere visualizzati in modo più evidente a causa del prezzo inferiore.

Per attenuare questo effetto, Vertex AI Search for commerce ha introdotto il filtro basato sugli incorporamenti semantici per rimuovere questi elementi meno pertinenti dai risultati di ricerca non predefiniti, migliorando l'esperienza utente.

Questo comportamento previsto potrebbe, tuttavia, portare a un minor numero di risultati di ricerca complessivi. La disattivazione del filtro può influire sulla qualità dei risultati di ricerca. Se la riduzione dei risultati di ricerca ti preoccupa, contatta l'assistenza.

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 mostrati risultati ordinati in base a più campi. Ad esempio, un utente sta cercando un abito con il miglior prezzo e sconto. Prezzo e sconto sono più campi qui. 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 come esempio il seguente set di dati. 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 nel 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 riepilogati nella tabella seguente.

campo description
"productId" L'ID prodotto (l'ultimo segmento di Product.name).
"brands" Product.brands.
"categories" Product.categories.
"genders" The Audience.genders.
"ageGroups" Audience.age_groups.
"availability" Product.availability. Il valore è uno tra "IN_STOCK", "OUT_OF_STOCK", PREORDER", "BACKORDER".
"colorFamilies" ColorInfo.color_families.
"colors" ColorInfo.colors.
"taglie" Product.sizes.
"materiali" Product.materials.
"patterns" The Product.patterns.
"condizioni" The Product.conditions.
"attributes.key" L'attributo personalizzato testuale nell'oggetto Prodotto. La chiave può essere qualsiasi chiave nella mappa Product.attributes, se i valori degli attributi sono testuali.
"pickupInStore" FulfillmentInfo.place_ids per il tipo "pickup-in-store".
"shipToStore" FulfillmentInfo.place_ids per il tipo "ship-to-store".
"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 testuale in Inventario.

I campi numerici supportati sono riassunti nella tabella seguente.

campo description
"price" PriceInfo.price.
"sconto" Lo sconto. Calcolato come (prezzo_originale - prezzo) / prezzo_originale.
"rating" Rating.average_rating.
"ratingCount" Rating.rating_count.
"attributes.key" L'attributo personalizzato numerico nell'oggetto Prodotto. 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 originale dell'inventario.
"inventory(place_id,attributes.key)" L'attributo personalizzato numerico in Inventario.

Sono consentite al massimo 10 congiunzioni o disgiunzioni nidificate.

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

scenario filtro
non è un accessorio Pixel "NOT categories: ANY(\"Pixel > featured accessories\")"
"più economico 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 riassunti nella tabella seguente.

campo description
"productId" L'ID prodotto (l'ultimo segmento di Product.name).
"title" Product.title.
"brands" Product.brands.
"categories" Product.categories.
"genders" The Audience.genders.
"ageGroups" Audience.age_groups.
"price" PriceInfo.price.
"sconto" Lo sconto. Calcolato come (prezzo_originale - prezzo) / prezzo.
"rating" Rating.average_rating.
"ratingCount" Rating.rating_count.
"attributes.key" L'attributo personalizzato nell'oggetto Prodotto. 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 originale dell'inventario.
"inventory(place_id,attributes.key)" L'attributo personalizzato numerico o testuale in Inventario.

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

Per un campo numerico con più valori, ad esempio un campo ripetuto o un campo impostato per varianti dei prodotti, il valore minimo viene utilizzato per l'ordinamento in ordine crescente e il valore massimo viene utilizzato 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.