Filtrar e ordenar os resultados

Esta página descreve como filtrar e ordenar com a pesquisa.

Tutorial de filtragem

Neste tutorial, demonstramos 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, são mostrados resultados 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 campos múltiplos. O usuário verá os vestidos ordenados por preço e aqueles com o mesmo preço, ordenados 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 dadoss

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

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
"conditions" 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
"price" PriceInfo.price
"discount" 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
"price" PriceInfo.price
"discount" 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 por um sufixo "desc", como "rating desc".

Em um campo numérico com vários valores, como um campo repetido ou definido para variantes de produto, o valor mínimo é usado para classificação por ordem crescente, e o máximo, para classificação em 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 itens com valores iguais nos campos de prioridade mais alta. Por exemplo, "rating desc, price" ordena itens com a mesma classificação por preço.