Filtrar e ordenar os resultados

Nesta página, descrevemos como filtrar e ordenar a pesquisa.

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 ou 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 preferida dele.


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. O preço e o desconto são vários campos aqui. O usuário vai encontrar os vestidos ordenados por preço e, no caso de vestidos 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 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.

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

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 por "desc" como "rating desc".

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