Memfilter dan mengurutkan hasil

Halaman ini menjelaskan pemfilteran dan pengurutan dengan pencarian.

Tutorial pemfilteran

Tutorial ini menunjukkan fitur pemfilteran. Alat ini memungkinkan Anda menyesuaikan permintaan penelusuran sesuai dengan kebutuhan Anda atau pelanggan Anda. Anda dapat memfilter menurut satu atau beberapa kolom, memfilter menurut kolom teks atau angka, atau keduanya. Anda dapat menggunakan bahasa ekspresi untuk membuat predikat bagi setiap kolom atau menggabungkan berbagai ekspresi menggunakan operator logika. Misalnya, pembeli yang mencari sepatu dapat menggunakan filter untuk mempersempit penelusuran ke merek dan warna yang diinginkan.


Untuk mengikuti panduan langkah demi langkah tugas ini langsung di Cloud Shell Editor, klik Pandu saya:

Pandu saya


Tutorial pemesanan

Tutorial ini menunjukkan cara mengurutkan item dalam respons penelusuran. Saat pengguna akhir mencari produk di situs Anda, mereka akan melihat hasil yang diurutkan berdasarkan beberapa kolom. Misalnya, pengguna menelusuri gaun dengan harga dan diskon terbaik. Harga dan diskon adalah beberapa kolom di sini. Pengguna akan melihat gaun yang diurutkan berdasarkan harga, dan untuk gaun dengan harga yang sama, diurutkan berdasarkan diskon.


Untuk mengikuti panduan langkah demi langkah tugas ini langsung di Cloud Shell Editor, klik Pandu saya:

Pandu saya


Contoh set data

Halaman ini menggunakan {i>dataset<i} berikut sebagai contoh. Hanya kolom yang diperlukan untuk contoh yang akan disertakan.

Filter

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);
  }
}

Sintaksis ekspresi filter dapat diringkas oleh EBNF berikut:

  # 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;

Kolom tekstual yang didukung diringkas dalam tabel berikut.

kolom deskripsi
"IDproduk" ID produk (segmen terakhir dari Product.name).
"merek" {i>Product.brands<i}.
"kategori" {i>Product.category<i}.
"gender" Audience.genders.
"ageGroups" Audience.age_groups.
"ketersediaan" {i>Product.availability<i}. Nilainya adalah salah satu dari "IN_STOCK", "OUT_OF_STOCK", PREORDER", "BACKORDER".
"colorKeluarga" ColorInfo.color_families.
"warna" ColorInfo.colors.
"ukuran" {i>Product.sizes<i}.
"bahan" Product.materials.
"pola" {i>Product.patterns<i}.
"conditions" {i>Product.conditions<i}.
"attribute.key" Atribut khusus tekstual dalam objek Produk. Kunci dapat berupa kunci apa pun dalam peta Product.attributes, jika nilai atribut bersifat tekstual.
"pickupInStore" Kolom FulfillmentInfo.place_ids untuk jenis "pickup-in-store".
"shipToStore" FulfillmentInfo.place_ids untuk jenis "ship-to-store".
"sameDayDelivery" FulfillmentInfo.place_ids untuk jenis "pengiriman pada hari yang sama".
"nextDayDelivery" FulfillmentInfo.place_ids untuk jenis "pengiriman hari berikutnya".
"customFulfillment1" FulfillmentInfo.place_ids untuk jenis "custom-type-1".
"customFulfillment2" FulfillmentInfo.place_ids untuk jenis "custom-type-2".
"customFulfillment3" FulfillmentInfo.place_ids untuk jenis "custom-type-3".
"customFulfillment4" FulfillmentInfo.place_ids untuk jenis "custom-type-4".
"customFulfillment5" FulfillmentInfo.place_ids untuk jenis "custom-type-5".
"inventory(place_id,attributes.key)" Atribut khusus tekstual di Inventaris.

Kolom numerik yang didukung diringkas dalam tabel berikut.

kolom deskripsi
"price" PriceInfo.price.
"discount" Diskon. Dihitung berdasarkan (original_price - price) / original_price.
"peringkat" Rating.average_rating.
"ratingCount" Rating.rating_count.
"attribute.key" Atribut khusus numerik di objek Produk. Kunci dapat berupa kunci apa pun dalam peta Product.attributes, jika nilai atributnya berupa angka.
"inventory(place_id,price)" Harga inventaris.
"inventory(place_id,original_price)" Harga inventaris asli.
"inventory(place_id,attributes.key)" Atribut khusus numerik di Inventaris.

Maksimal 10 konjungsi atau disjungsi bertingkat diperbolehkan.

Misalnya, untuk menelusuri produk Google dalam situasi berikut, Anda dapat menetapkan query sebagai "Google" dan menetapkan filter sebagai nilai yang ditampilkan dalam tabel berikut:

skenario filter
bukan aksesori Pixel "BUKAN kategori: APAPUN(\"Pixel > aksesori unggulan\")"
"lebih murah dari 100 dolar" "harga: IN(*, 100,0e)"
"Speaker Nest tidak lebih murah dari 80 dolar" "(kategori: APAPUN(\"Nest > speaker dan layar\")) DAN (harga: IN(80.0i, *))"

Order

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);
  }
}

Kolom yang dapat diurutkan yang didukung dirangkum dalam tabel berikut.

kolom deskripsi
"IDproduk" ID produk (segmen terakhir dari Product.name).
"judul" {i>Product.title<i}.
"merek" {i>Product.brands<i}.
"kategori" {i>Product.category<i}.
"gender" Audience.genders.
"ageGroups" Audience.age_groups.
"price" PriceInfo.price.
"discount" Diskon. Dihitung berdasarkan (original_price - price) / price.
"peringkat" Rating.average_rating.
"ratingCount" Rating.rating_count.
"attribute.key" Atribut khusus dalam objek Produk. Kunci dapat berupa kunci apa pun dalam peta Product.attributes.
"inventory(place_id,price)" Harga inventaris.
"inventory(place_id,original_price)" Harga inventaris asli.
"inventory(place_id,attributes.key)" Atribut khusus numerik atau tekstual dalam Inventaris.

Secara {i>default<i}, urutannya adalah menaik. Urutan menurun dapat ditentukan oleh akhiran "desc", seperti, "rating desc".

Untuk kolom numerik dengan beberapa nilai, misalnya, kolom berulang atau kolom yang ditetapkan untuk produk varian, nilai minimum digunakan untuk mengurutkan menurut urutan menaik dan nilai maksimum digunakan untuk mengurutkan berdasarkan urutan menurun.

Pengurutan berdasarkan beberapa kolom didukung melalui penggunaan kolom yang dipisahkan koma sesuai urutan prioritas. Kolom dengan prioritas lebih rendah digunakan untuk mengurutkan item dengan nilai sama untuk kolom dengan prioritas lebih tinggi. Misalnya, "rating desc, price" mengurutkan item dengan rating yang sama menurut harga.