Esta é a documentação do Recommendations AI, da Pesquisa de varejo e do novo Console do Retail.

Filtrar e ordenar os resultados

Esta página descreve a filtragem e a ordenação com a Pesquisa de varejo.

Tutorial sobre filtragem

Neste tutorial, mostramos alguns exemplos de filtragem de produtos.


Para orientações passo a passo sobre esta tarefa diretamente no editor do Cloud Shell, clique em Orientações:

Orientação


As seções a seguir guiam você pelas mesmas etapas que você encontra clicando em Orientações.

Tutorial de ordenação

Neste tutorial, você vai ver como ordenar itens em uma resposta de pesquisa.


Para orientações passo a passo sobre esta tarefa diretamente no editor do Cloud Shell, clique em Orientações:

Orientação


As seções a seguir guiam você pelas mesmas etapas que você encontra clicando em 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.

Filtrar

Java

public static SearchResponse searchFilteredProducts(String query, int pageSize,
    String filter) throws IOException, InterruptedException {
  SearchServiceClient searchClient = getSearchServiceClient();

  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
  .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setFilter(filter)
      .build();

  SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();

  searchClient.shutdownNow();
  searchClient.awaitTermination(2, TimeUnit.SECONDS);

  return response;
}

A sintaxe da expressão de filtro pode ser resumida pelo seguinte EBNF:

  # A single expression or multiple expressions that are joint by "AND" or "OR".
  filter = expression, { " AND " | "OR", expression };

  # A expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
                    # A parenthesized expression
                    | "(", expression, ")"
                    # A simple expression applying to a textual field.
                    # Function "ANY" returns true if the field contains any of the literals.
                    ( textual_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 applying 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.
  # Specify inclusive bound with character 'i' for inclusive or exclusive bound
  # with character 'e', explicitly.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";

  # An upper_bound is either a double, or "*" which represents infinity.
  # Specify inclusive bound with character 'i' for inclusive or exclusive bound
  # with character 'e', explicitly.
  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;

  textual_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.

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

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, *))"

Ordem

Java

public static SearchResponse searchOrderedProducts(String query, int pageSize,
    String orderBy) throws IOException, InterruptedException {
  SearchServiceClient searchClient = getSearchServiceClient();

  SearchRequest searchRequest = SearchRequest.newBuilder()
      .setPlacement(DEFAULT_SEARCH_PLACEMENT_NAME)
      .setBranch(DEFAULT_BRANCH_NAME)
      .setVisitorId(VISITOR_ID)
      .setQuery(query)
      .setPageSize(pageSize)
      .setOrderBy(orderBy)
      .build();

  SearchResponse response = searchClient.search(searchRequest).getPage().getResponse();

  searchClient.shutdownNow();
  searchClient.awaitTermination(2, TimeUnit.SECONDS);

  return response;
}

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".

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 itens com valores iguais aos de maior prioridade. Por exemplo, "rating desc, price" organiza itens com a mesma classificação por preço.