Esta é a documentação do Recommendations AI, da Pesquisa de varejo e do novo Console do Varejo. Para usar a pesquisa de varejo na fase GA restrita, entre em contato com a equipe de vendas do Cloud.

Se você estiver usando apenas o Recommendations AI, permaneça no Console do Recommendations e consulte a documentação do Recommendations AI.

Como filtrar e ordenar os resultados

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

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

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,attributes.key)" O atributo personalizado numérico em Inventário.

O número máximo de expressões reunidas por "AND" é 20. O número máximo de expressões simples reunidas por "OR" é 10. O número máximo de literais na função "ANY" é 100.

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,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 serã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.