Filtre e ordene os resultados

Esta página descreve a filtragem e a ordenação com a pesquisa.

A filtragem semântica otimiza a ordenação não predefinida

O Vertex AI Search for commerce foi concebido para mostrar uma grande variedade de resultados, incluindo itens marginalmente relevantes que são populares ou estão a tornar-se populares. Isto é eficaz nas pesquisas predefinidas (ordenadas por relevância), mas nas pesquisas não predefinidas que usam a funcionalidade order_by, como a ordenação por preço, os artigos menos relevantes podem aparecer de forma mais proeminente devido a um preço mais baixo, por exemplo.

Para atenuar este efeito, a Vertex AI Search for commerce introduziu a filtragem baseada em incorporação semântica para remover estes itens menos relevantes dos resultados da pesquisa não predefinidos, melhorando a experiência do utilizador.

No entanto, este comportamento pretendido pode levar a menos resultados de pesquisa no geral. A desativação da filtragem pode afetar a qualidade dos resultados da pesquisa. Assim, se a diminuição dos resultados da pesquisa for uma preocupação, contacte o apoio técnico.

Tutorial de filtragem

Este tutorial demonstra a funcionalidade de filtragem. Permite-lhe ajustar as solicitações de pesquisa de acordo com as suas necessidades ou as do seu cliente. Pode filtrar por um ou vários campos, filtrar por campos de texto ou numéricos, ou ambos. Pode usar uma linguagem de expressão para criar um predicado para cada campo ou combinar diferentes expressões através de operadores lógicos. Por exemplo, um comprador à procura de sapatos pode usar filtros para restringir a pesquisa à sua marca e cor preferidas.


Para seguir orientações passo a passo para esta tarefa diretamente no editor do Cloud Shell, clique em Orientar-me:

Visita guiada


Tutorial de ordenação

Este tutorial mostra como ordenar itens numa resposta de pesquisa. Quando um utilizador final procura um produto no seu site, são apresentados resultados ordenados por vários campos. Por exemplo, um utilizador está a pesquisar um vestido com o melhor preço e desconto. O preço e o desconto são vários campos aqui. O utilizador vê os vestidos ordenados por preço e, para os vestidos com o mesmo preço, ordenados por desconto.


Para seguir orientações passo a passo para esta tarefa diretamente no editor do Cloud Shell, clique em Orientar-me:

Visita guiada


Exemplo de conjunto de dados

Esta página usa o seguinte conjunto de dados como exemplo. Apenas estão incluídos os campos necessários para o exemplo.

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

A sintaxe da expressão de filtro pode ser resumida pela seguinte 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;

Os campos de texto suportados estão resumidos na tabela seguinte.

campo descrição
"productId" O ID do produto (o último segmento de Product.name).
"brands" O elemento Product.brands.
"categories" O elemento Product.categories.
"genders" The Audience.genders.
"ageGroups" O Audience.age_groups.
"availability" O Product.availability. O valor é um dos seguintes: "IN_STOCK", "OUT_OF_STOCK", PREORDER", "BACKORDER".
"colorFamilies" O ColorInfo.color_families.
"colors" The ColorInfo.colors.
"sizes" O elemento Product.sizes.
"materials" O Product.materials.
"patterns" O Product.patterns.
"condições" O elemento Product.conditions.
"attributes.key" O atributo personalizado textual no objeto Product. A chave pode ser qualquer chave no mapa Product.attributes, se os valores dos atributos forem textuais.
"pickupInStore" O FulfillmentInfo.place_ids para o tipo "pickup-in-store".
"shipToStore" Os FulfillmentInfo.place_ids para o tipo "ship-to-store".
"sameDayDelivery" Os FulfillmentInfo.place_ids para o tipo "same-day-delivery".
"nextDayDelivery" O FulfillmentInfo.place_ids para o tipo "next-day-delivery".
"customFulfillment1" O FulfillmentInfo.place_ids para o tipo "custom-type-1".
"customFulfillment2" O FulfillmentInfo.place_ids para o tipo "custom-type-2".
"customFulfillment3" O FulfillmentInfo.place_ids para o tipo "custom-type-3".
"customFulfillment4" O FulfillmentInfo.place_ids para o tipo "custom-type-4".
"customFulfillment5" O FulfillmentInfo.place_ids para o tipo "custom-type-5".
"inventory(place_id,attributes.key)" O atributo personalizado textual no inventário.

Os campos numéricos suportados estão resumidos na tabela seguinte.

campo descrição
"price" O PriceInfo.price.
"discount" O desconto. Calculado por (original_price - price) / original_price.
"rating" The Rating.average_rating.
"ratingCount" O Rating.rating_count.
"attributes.key" O atributo personalizado numérico no objeto Product. A chave pode ser qualquer chave no mapa Product.attributes, se os valores dos atributos forem numéricos.
"inventory(place_id,price)" O preço do inventário.
"inventory(place_id,original_price)" O preço original do inventário.
"inventory(place_id,attributes.key)" O atributo personalizado numérico no inventário.

São permitidas, no máximo, 10 conjunções ou disjunções aninhadas.

Por exemplo, para pesquisar um produto Google nas seguintes situações, pode definir query como "Google" e definir filter como os valores apresentados na tabela seguinte:

cenário filtrar
Não é um acessório Pixel "NOT categories: ANY(\"Pixel > featured accessories\")"
"mais barato do que 100 dólares" "price: IN(*, 100.0e)"
"Nest speaker not cheaper than 80 dollars" (O altifalante do Nest não é mais barato do que 80 dólares) "(categories: ANY(\"Nest > speakers and displays\")) AND (price: IN(80.0i, *))"

Encomenda

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

Os campos ordenáveis compatíveis estão resumidos na tabela seguinte.

campo descrição
"productId" O ID do produto (o último segmento de Product.name).
"title" O elemento Product.title.
"brands" O elemento Product.brands.
"categories" O elemento Product.categories.
"genders" The Audience.genders.
"ageGroups" O Audience.age_groups.
"price" O PriceInfo.price.
"discount" O desconto. Calculado por (original_price - price) / price.
"rating" The Rating.average_rating.
"ratingCount" O Rating.rating_count.
"attributes.key" O atributo personalizado no objeto Product. A chave pode ser qualquer chave no mapa Product.attributes.
"inventory(place_id,price)" O preço do inventário.
"inventory(place_id,original_price)" O preço original do inventário.
"inventory(place_id,attributes.key)" O atributo personalizado numérico ou de texto no inventário.

Por predefinição, a ordem é ascendente. A ordem descendente pode ser especificada com o sufixo "desc", como "rating desc".

Para um campo numérico com vários valores, por exemplo, um campo repetido ou um campo definido para produtos variantes, o valor mínimo é usado para a ordenação por ordem ascendente e o valor máximo é usado para a ordenação por ordem descendente.

A ordenação por vários campos é suportada através da utilização de campos separados por vírgulas por ordem de prioridade. Os campos de prioridade mais baixa são usados para ordenar itens com valores iguais para campos de prioridade mais alta. Por exemplo, "rating desc, price" ordena os itens com a mesma classificação por preço.