סינון ומיון של תוצאות

בדף הזה מוסבר איך מסננים וממיינים באמצעות חיפוש.

סינון סמנטי מאפשר אופטימיזציה של מיון שאינו ברירת המחדל

AI Commerce Search מתוכנן להציג מגוון רחב של תוצאות, כולל פריטים שרלוונטיים במידה מועטה אבל פופולריים או נמצאים במגמת עלייה. השיטה הזו יעילה בחיפושים שמוגדרים כברירת מחדל (ממוינים לפי רלוונטיות), אבל בחיפושים שלא מוגדרים כברירת מחדל ומשתמשים בתכונה order_by, כמו מיון לפי מחיר, יכול להיות שפריטים פחות רלוונטיים יופיעו במיקום בולט יותר בגלל מחיר נמוך יותר, למשל.

כדי לצמצם את ההשפעה הזו, AI Commerce Search הציג סינון שמבוסס על הטמעה סמנטית, כדי להסיר מתוצאות החיפוש שאינן ברירת המחדל את הפריטים שפחות רלוונטיים, וכך לשפר את חוויית המשתמש.

עם זאת, יכול להיות שההתנהגות הזו תוביל להצגה של פחות תוצאות חיפוש באופן כללי. השבתת הסינון עלולה לפגוע באיכות של תוצאות החיפוש. אם אתם מודאגים מכך שמוצגים פחות תוצאות חיפוש, אתם יכולים לפנות לתמיכה.

מדריך לסינון

במדריך הזה מוצגת תכונת הסינון. היא מאפשרת לכם לכוונן את בקשות החיפוש בהתאם לצרכים שלכם או של הלקוחות. אפשר לסנן לפי שדה אחד או כמה שדות, לפי שדות טקסט או שדות מספריים, או לפי שניהם. אפשר להשתמש בשפת ביטויים כדי ליצור פרדיקט לכל שדה, או לשלב בין ביטויים שונים באמצעות אופרטורים לוגיים. לדוגמה, קונה שמחפש נעליים יכול להשתמש במסננים כדי לצמצם את החיפוש למותג ולצבע המועדפים עליו.


בלחיצה על תראו לי איך תקבלו הסבר מפורט על המשימה ישירות ב-Cloud Shell Editor:

תראו לי איך


מדריך להזמנת סרטונים

במדריך הזה מוסבר איך להזמין פריטים בתגובה לחיפוש. כשמשתמש קצה מחפש מוצר באתר שלכם, מוצגות לו תוצאות שממוינות לפי כמה שדות. לדוגמה, משתמש מחפש שמלה עם המחיר וההנחה הכי טובים. המחיר וההנחה הם שדות מרובים. המשתמש יראה את השמלות מסודרות לפי מחיר, ואם יש שמלות עם אותו מחיר, הן יסודרו לפי הנחה.


בלחיצה על תראו לי איך תקבלו הסבר מפורט על המשימה ישירות ב-Cloud Shell Editor:

תראו לי איך


מערך נתונים לדוגמה

בדף הזה נעשה שימוש במערך הנתונים הבא כדוגמה. כללנו רק את השדות שנדרשים בדוגמה.

מסנן

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

אפשר לסכם את תחביר ביטוי הסינון באמצעות 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;

בטבלה הבאה מפורטים השדות הטקסטואליים הנתמכים.

שדה description
‪"productId" מזהה המוצר (הפלח האחרון של Product.name).
‫"brands" המאפיין Product.brands.
‫"categories" הקטגוריות של המוצר.
‫"genders" המאפיין Audience.genders.
‫"ageGroups" המאפיין Audience.age_groups.
‫"availability" המאפיין Product.availability. הערך הוא אחד מהערכים הבאים: IN_STOCK (במלאי), OUT_OF_STOCK (חסר במלאי), PREORDER (בהזמנה מראש), BACKORDER (בהמתנה להשלמת מלאי).
‫"colorFamilies" ‫ColorInfo.color_families.
"colors" המאפיין ColorInfo.colors.
‫"sizes" המאפיין Product.sizes.
"materials" המאפיין Product.materials.
‫"patterns" ‏(תבניות) המאפיין Product.patterns.
‫"conditions" ‏(תנאים) התנאים של המוצר.
‫"attributes.key" מאפיין מותאם אישית מסוג טקסט באובייקט Product. המפתח יכול להיות כל מפתח במפה Product.attributes, אם ערכי המאפיינים הם טקסטואליים.
‫"pickupInStore" ‫FulfillmentInfo.place_ids לסוג 'איסוף בחנות'.
‫"shipToStore" המאפיין FulfillmentInfo.place_ids לסוג 'משלוח לחנות'.
‪"sameDayDelivery" המאפיין FulfillmentInfo.place_ids עבור סוג המשלוח same-day-delivery.
‫"nextDayDelivery"‏ (משלוח ביום המחרת) ‫FulfillmentInfo.place_ids לסוג 'משלוח ביום המחרת'.
‫"customFulfillment1" ‫FulfillmentInfo.place_ids עבור הסוג custom-type-1.
‫"customFulfillment2" ‫FulfillmentInfo.place_ids לסוג 'custom-type-2'.
‪"customFulfillment3" הערכים של FulfillmentInfo.place_ids עבור הסוג custom-type-3.
‪"customFulfillment4" המאפיין FulfillmentInfo.place_ids לסוג 'custom-type-4'.
‪"customFulfillment5" ‫FulfillmentInfo.place_ids עבור הסוג custom-type-5.
‪"inventory(place_id,attributes.key)" מאפיין מותאם אישית מסוג טקסט במלאי.

בטבלה הבאה מפורטים השדות המספריים הנתמכים.

שדה description
‫"price" ‫PriceInfo.price.
‫"discount" ‏(הנחה) ההנחה. החישוב מתבצע לפי הנוסחה (original_price - price) / original_price.
‫"rating" הדירוג הממוצע.
‫"ratingCount" הערך של Rating.rating_count.
‫"attributes.key" המאפיין המספרי המותאם אישית באובייקט Product. הפרמטר key יכול להיות כל מפתח במפה Product.attributes, אם ערכי המאפיינים הם מספריים.
‫"inventory(place_id,price)‎" המחיר בנתוני המלאי.
‪"inventory(place_id,original_price) המחיר המקורי של המלאי.
‪"inventory(place_id,attributes.key)" המאפיין המספרי המותאם אישית במלאי.

מותר להשתמש ב-10 קשרים לוגיים מסוג 'וגם' או 'או' לכל היותר.

לדוגמה, כדי לחפש מוצר של Google במצבים הבאים, אפשר להגדיר את query כ-Google ואת filter כערכים שמוצגים בטבלה הבאה:

תרחיש מסנ
לא אביזר של Pixel ‫"NOT categories: ANY(\"Pixel > featured accessories\")"
‫"cheaper than 100 dollars" (יותר זול מ-100 דולר) ‪"price: IN(*, 100.0e)"
‫Nest speaker not cheaper than 80 dollars ‪"(categories: ANY(\"Nest > speakers and displays\")) AND (price: IN(80.0i, *))"

הזמנה

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

בטבלה הבאה מפורטים השדות הנתמכים שאפשר להשתמש בהם למיון.

שדה description
‪"productId" מזהה המוצר (הפלח האחרון של Product.name).
‫"title" המאפיין Product.title.
‫"brands" המאפיין Product.brands.
‫"categories" הקטגוריות של המוצר.
‫"genders" המאפיין Audience.genders.
‫"ageGroups" המאפיין Audience.age_groups.
‫"price" ‫PriceInfo.price.
‫"discount" ‏(הנחה) ההנחה. החישוב מתבצע לפי הנוסחה (מחיר מקורי – מחיר) חלקי מחיר.
‫"rating" הדירוג הממוצע.
‫"ratingCount" הערך של Rating.rating_count.
‫"attributes.key" המאפיין המותאם אישית באובייקט Product. המפתח יכול להיות כל מפתח במיפוי Product.attributes.
‫"inventory(place_id,price)‎" המחיר בנתוני המלאי.
‪"inventory(place_id,original_price) המחיר המקורי של המלאי.
‪"inventory(place_id,attributes.key)" מאפיין בהתאמה אישית מספרי או טקסטואלי במלאי.

כברירת מחדל, הסדר הוא עולה. כדי לציין סדר יורד, מוסיפים את הסיומת desc, למשל, rating desc.

בשדה מספרי עם כמה ערכים, למשל שדה שחוזר על עצמו או שדה שמוגדר למשפחת מוצרים, הערך המינימלי משמש למיון בסדר עולה והערך המקסימלי משמש למיון בסדר יורד.

אפשר להשתמש בכמה שדות מופרדים בפסיקים לפי סדר העדיפות כדי להגדיר סדר מיון לפי כמה שדות. השדות עם העדיפות הנמוכה יותר משמשים לסידור פריטים עם ערכים שווים בשדות עם עדיפות גבוהה יותר. לדוגמה, הערך 'rating desc, price' ממיין את הפריטים עם אותו דירוג לפי מחיר.