Filtrar e organizar resultados

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

A filtragem semântica otimiza a classificação não padrão

A Vertex AI para Pesquisa para comércio foi projetada para mostrar uma grande variedade de resultados, incluindo itens marginalmente relevantes que são populares ou estão em alta. Isso é eficaz em pesquisas padrão (classificadas por relevância), mas em pesquisas não padrão que usam o recurso order_by, como "Ordenar por preço", itens menos relevantes podem aparecer com mais destaque devido ao preço mais baixo, por exemplo.

Para reduzir esse efeito, a Vertex AI Search para e-commerce introduziu a filtragem baseada em incorporação semântica para remover esses itens menos relevantes dos resultados de pesquisa não padrão, melhorando a experiência do usuário.

No entanto, esse comportamento intencional pode resultar em menos resultados da pesquisa no geral. Desativar a filtragem pode afetar a qualidade dos resultados da pesquisa. Se você se preocupa com a redução dos resultados da pesquisa, entre em contato com o suporte.

Tutorial de filtragem

Este tutorial demonstra o recurso de filtragem. Ele permite ajustar as solicitações de pesquisa de acordo com as suas necessidades ou as de clientes. É possível filtrar por um ou vários campos, por campos de texto, numéricos ou ambos. Você pode usar uma linguagem de expressão para construir um predicado para cada campo ou combinar diferentes expressões usando operadores lógicos. Por exemplo, um comprador que procura sapatos pode usar filtros para restringir a pesquisa à marca e cor preferidas.


Para seguir as instruções da tarefa diretamente no editor do Cloud Shell, clique em Orientação:

Orientações


Tutorial de ordenação

Neste tutorial, mostramos como ordenar itens em uma resposta de pesquisa. Quando um usuário final procura um produto no seu site, os resultados são ordenados por vários campos. Por exemplo, um usuário está procurando um vestido com o melhor preço e desconto. Preço e desconto são vários campos aqui. Os vestidos vão aparecer ordenados por preço e, para os vestidos com o mesmo preço, por desconto.


Para seguir as instruções da tarefa diretamente no editor do Cloud Shell, clique em Orientação:

Orientações


Exemplo de conjunto de dados

Nesta página, usamos o conjunto de dados a seguir como exemplo. Somente os campos necessários para o exemplo são incluídos.

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 pelo 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 compatíveis são resumidos na tabela a seguir.

field descrição
"productId" O ID do produto (o último segmento em Product.name).
"brands" Product.brands
"categorias" Product.categories
"gêneros" Audience.genders
"ageGroups" Audiences.age_groups
"availability" Product.availability O valor pode ser "IN_STOCK", "OUT_OF_STOCK", PREORDER", "BACKORDER".
"colorFamilies" ColorInfo.color_families
"cores" ColorInfo.colors
"tamanhos" Product.sizes
"materiais" Product.materials
"padrões" Product.patterns
"condições" Product.conditions
"attributes.key" O atributo personalizado textual no objeto "Produto". A chave pode ser qualquer chave no mapa Product.attributes se os valores do atributo forem textuais.
"pickupInStore" FulfillmentInfo.place_ids for type "pickup-in-store"
"shipToStore" FulfillmentInfo.place_ids for type "ship-to-store"
"sameDayDelivery" FulfillmentInfo.place_ids for type "same-day-delivery"
"nextDayDelivery" FulfillmentInfo.place_ids for type "next-day-delivery"
"customFulfillment1" FulfillmentInfo.place_ids for type "custom-type-1"
"customFulfillment2" FulfillmentInfo.place_ids for type "custom-type-2"
"customFulfillment3" FulfillmentInfo.place_ids for type "custom-type-3"
"customFulfillment4" FulfillmentInfo.place_ids for type "custom-type-4"
"customFulfillment5" FulfillmentInfo.place_ids for type "custom-type-5"
"inventory(place_id,attributes.key)" É o atributo de texto personalizado no Inventário.

Os campos numéricos compatíveis estão resumidos na tabela a seguir.

field descrição
"preço" PriceInfo.price
"desconto": O desconto. Cálculo: (original_price - price) / original_price.
"classificação" Rating.average_rating
"ratingCount" Rating.rating_count
"attributes.key" O atributo personalizado numérico no objeto "Produto". A chave pode ser qualquer chave no mapa Product.attributes se os valores do atributo 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 em Inventário.

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

Por exemplo, para pesquisar um produto do Google nas seguintes situações, defina query como "Google" e filter como os valores mostrados na tabela a seguir:

scenario filter
não é um acessório do Pixel "NOT categories: ANY(\"Pixel > featured accessories\")"
"mais barato que 100 dólares" "price: IN(*, 100.0e)"
"O alto-falante Nest não é mais barato que 80 dólares" "(categories: ANY(\"Nest > speakers and displays\")) AND (price: IN(80.0i, *))"

Pedido

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 compatíveis estão resumidos na tabela a seguir.

field descrição
"productId" O ID do produto (o último segmento em Product.name).
"título" Product.title
"brands" Product.brands
"categorias" Product.categories
"gêneros" Audience.genders
"ageGroups" Audiences.age_groups
"preço" PriceInfo.price
"desconto": O desconto. Cálculo: (original_price - preço) / preço.
"classificação" Rating.average_rating
"ratingCount" Rating.rating_count
"attributes.key" O atributo personalizado no objeto "Produto". 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 numérico numérico ou textual no inventário.

Por padrão, a ordem é crescente. A ordem decrescente pode ser especificada pelo sufixo "desc", como "rating desc".

Para um campo numérico com vários valores, por exemplo, um campo repetido ou um campo definido para variantes de produto, o valor mínimo é usado para classificação por ordem crescente, e o valor máximo é usado para classificação por ordem decrescente.

A ordenação por vários campos aceita o uso de campos separados por vírgulas em ordem de prioridade. Os campos de menor prioridade são usados para ordenar os itens com valores iguais para campos de maior prioridade. Por exemplo, "rating desc, price" ordena itens com a mesma classificação por preço.