חיפוש עם היבטים

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

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

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

הנתונים המצטברים של היבט מסוים מראים את ההתפלגות של ערכי ההיבט. לדוגמה, יכול להיות שההיבט 'גודל' יופיע ברבים מהמסמכים בערכת התוצאות. הנתונים המצטברים של ההיבט הזה יכולים להראות שהערך small הופיע 100 פעמים, הערך medium הופיע 300 פעמים והערך large הופיע 250 פעמים. כל זוג של מאפיין/ערך מייצג קבוצת משנה של מסמכים בתוצאת השאילתה. מפתח, שנקרא שיפור, משויך לכל זוג. אפשר לכלול הצעות לשיפור החיפוש בשאילתה כדי לאחזר מסמכים שתואמים למחרוזת השאילתה ושכוללים את ערכי ההיבטים שמתאימים להצעה אחת או יותר לשיפור החיפוש.

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

הוספת היבטים למסמך

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

def add_faceted_document(index):
    document = search.Document(
        doc_id="doc1",
        fields=[search.AtomField(name="name", value="x86")],
        facets=[
            search.AtomFacet(name="type", value="computer"),
            search.NumberFacet(name="ram_size_gb", value=8),
        ],
    )

    index.put(document)

מאפיין דומה לשדה במסמך. יש לו שם והוא מקבל ערך אחד.

שמות ההיבטים פועלים לפי אותם כללים כמו שדות מסמכים: השמות הם תלויי-רישיות ויכולים להכיל רק תווים מסוג ASCII. הם חייבים להתחיל באות ויכולים להכיל אותיות, ספרות או קו תחתון. השם לא יכול להכיל יותר מ-500 תווים.

הערך של היבט יכול להיות מחרוזת אטומית (באורך של עד 500 תווים) או מספר (ערך נקודה צפה בדיוק כפול, בין ‎-2,147,483,647 לבין 2,147,483,647).

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

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

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

כשמוסיפים היבט למסמך, הוא מקבל סוג ספציפי, אבל בתוצאות החיפוש מוצגים כל הערכים שלו. לדוגמה, התוצאות של ההיבט size יכולות להראות שהיו 100 מקרים של הערך small,‏ 150 מקרים של הערך medium ו-135 מקרים של ערכים מספריים בטווח [4, 8). לא מוצגים הערכים המספריים המדויקים והתפלגות התדירות שלהם.

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

שימוש בחיפוש עם היבטים כדי לאחזר מידע על היבטים

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

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

גילוי אוטומטי של היבטים

התכונה 'גילוי היבטים אוטומטי' מחפשת את ההיבטים שמופיעים בתדירות הגבוהה ביותר בצבירת הנתונים במסמכים. לדוגמה, נניח שהמסמכים שתואמים לשאילתה שלכם כוללים היבט 'צבע' שמופיע 5 פעמים עם הערך 'אדום', 5 פעמים עם הערך 'לבן' ו-5 פעמים עם הצבע 'כחול'. במאפיין הזה יש ספירה כוללת של 15. לצורך גילוי, הוא ידורג גבוה יותר ממאפיין אחר, 'גוון', שמופיע באותם מסמכים תואמים 6 פעמים עם הערך 'כהה' ו-7 פעמים עם הערך 'בהיר'.

כדי להפעיל את גילוי הפנים, צריך להגדיר אותו בשאילתה:

def facet_discovery(index):
    # Create the query and enable facet discovery.
    query = search.Query("name:x86", enable_facet_discovery=True)
    results = index.search(query)

    for facet in results.facets:
        print("facet {}.".format(facet.name))
        for value in facet.values:
            print(
                "{}: count={}, refinement_token={}".format(
                    value.label, value.count, value.refinement_token
                )
            )

כשמאחזרים היבטים באמצעות חיפוש רחב, כברירת מחדל יוחזרו רק 10 הערכים השכיחים ביותר של היבט.

אפשר להגדיל את המגבלה הזו עד 100 באמצעות הפרמטר FacetOptions discovery_limit.

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

ערכי מחרוזת יוחזרו בנפרד. הערכים המספריים של היבט שזוהה מוחזרים בטווח יחיד [min max). אפשר לבדוק את הטווח הזה וליצור טווח משנה קטן יותר לשאילתה מאוחרת יותר.

בחירת היבטים לפי שם

כדי לאחזר מידע על היבט לפי השם שלו בלבד, מוסיפים פרמטר לשאילתה, כולל שם ההיבט ברשימה:return_facets

def facet_by_name(index):
    # Create the query and specify to only return the "type" and "ram_size_gb"
    # facets.
    query = search.Query("name:x86", return_facets=["type", "ram_size_gb"])
    results = index.search(query)

    for facet in results.facets:
        print("facet {}".format(facet.name))
        for value in facet.values:
            print(
                "{}: count={}, refinement_token={}".format(
                    value.label, value.count, value.refinement_token
                )
            )

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

אפשר להגדיל את המגבלה הזו עד 20 באמצעות הפרמטר FacetOptions discovery_value_limit.

בחירת היבטים לפי שם וערך

כדי לאחזר מידע רק על ערכים מסוימים של היבט, מוסיפים פרמטר return_facets שכולל אובייקט FacetRequest עם רשימת ערכים:

def facet_by_name_and_value(index):
    # Create the query and specify to return the "type" facet with values
    # "computer" and "printer" and the "ram_size_gb" facet with value in the
    # ranges [0,4), [4, 8), and [8, max].
    query = search.Query(
        "name:x86",
        return_facets=[
            search.FacetRequest("type", values=["computer", "printer"]),
            search.FacetRequest(
                "ram_size_gb",
                ranges=[
                    search.FacetRange(end=4),
                    search.FacetRange(start=4, end=8),
                    search.FacetRange(start=8),
                ],
            ),
        ],
    )

    results = index.search(query)
    for facet in results.facets:
        print("facet {}".format(facet.name))
        for value in facet.values:
            print(
                "{}: count={}, refinement_token={}".format(
                    value.label, value.count, value.refinement_token
                )
            )

הערכים ב-FacetRequest אחד חייבים להיות מאותו סוג, כלומר רשימה של ערכי מחרוזות או, אם מדובר במספרים, רשימה של FacetRanges, שהם מרווחים שסגורים משמאל (התחלה) ופתוחים מימין (סוף). אם הפן כולל ערכים מסוג מחרוזת ומסוג מספר, צריך להוסיף תג FacetRequests נפרד לכל אחד מהם.

אפשרויות

אפשר לשלוט בחיפוש עם היבטים על ידי הוספת הפרמטר facet_options לקריאה של שאילתה. הפרמטר הזה מקבל מופע יחיד של FacetOptions. משתמשים בפרמטר הזה כדי לשנות את התנהגות ברירת המחדל של חיפוש עם היבטים.

options = FacetOptions(discover_facet_limit=5,
                       discover_facet_value_limit=10,
                       depth=6000);
פרמטר תיאור ברירת מחדל
discover_facet_limit מספר המאפיינים שיוצגו אם האפשרות 'גילוי מאפיינים' מופעלת. אם הערך הוא 0, גילוי הפנים מושבת. 10
discover_facet_value_limit מספר הערכים שיוחזרו לכל אחד מההיבטים המובילים שזוהו. 10
depth המספר המינימלי של מסמכים בתוצאות השאילתה שצריך להעריך כדי לאסוף מידע על מאפיינים. 1000

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

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

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

אחזור תוצאות של היבטים

כשמשתמשים בפרמטרים של חיפוש עם היבטים בשאילתה, מידע מצטבר על ההיבטים מגיע עם תוצאת השאילתה עצמה.

שאילתה תכלול רשימה של FacetResult. בתוצאות החיפוש תופיע שורה אחת לכל היבט שהופיע במסמך שתאם לשאילתה. לכל תוצאה יופיעו:

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

שימו לב שרשימת הערכים תכלול את המחרוזת של הפן וגם את הערכים המספריים שלו. אם הפן זוהה אוטומטית, הערכים המספריים שלו מוחזרים כמרווח יחיד [min max). אם ביקשתם במפורש פן מספרי עם טווח אחד או יותר בשאילתה, הרשימה תכיל מרווח סגור-פתוח אחד [התחלה סוף) לכל טווח.

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

אפשר לקרוא את המידע המצטבר של כל היבט מתוצאות החיפוש:

query = search.Query(...)
results = index.search(query)
for facet_info in results.facets:
  ...

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

FacetResult(name='size', values=[
  FacetResultValue(label='[8, 10)', 22, refinement=refinement_key),
  FacetResultValue(label='small', 100, refinement=refinement_key),
  FacetResultValue(label='medium', 300, refinement=refinement_key),
  FacetResultValue(label='large', 250, refinement=refinement_key)])

הפרמטר label נוצר מערך של היבט. לערכים מספריים ‫label הוא הייצוג של טווח.

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

שימוש בהיבטים כדי לצמצם או לסנן שאילתה

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

query = search.Query(..., facet_refinements=[refinement_key1, refinement_key2, refinement_key3])

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

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