טיפול בתוצאות החיפוש

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

תוצאות

def query_results(index, query_string):
    result = index.search(query_string)
    total_matches = result.number_found
    list_of_docs = result.results
    number_of_docs_returned = len(list_of_docs)
    return total_matches, list_of_docs, number_of_docs_returned

בהתאם לערך של limit query option, מספר המסמכים התואמים שמוחזרים בתוצאה עשוי להיות קטן ממספר המסמכים שנמצאו. חשוב לזכור שהמספר שיימצא יהיה הערכה אם רמת הדיוק של המספר שיימצא תהיה נמוכה מהמספר שיימצא. לא משנה איך תגדירו את אפשרויות החיפוש, קריאה ל-search() לא תחזיר יותר מ-10,000 מסמכים שתואמים לחיפוש.

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

מסמכים עם ניקוד

תוצאות החיפוש יכללו רשימה של [ScoredDocuments]/appengine/docs/standard/services/search/python/scoreddocumentclass) שתואמים לשאילתה. אפשר לבצע איטרציה על הרשימה כדי לעבד כל מסמך בתורו:

for scored_document in results:
        print(scored_document)

כברירת מחדל, מסמך עם ניקוד מכיל את כל השדות של המסמך המקורי שעבר אינדוקס. אם אפשרויות השאילתה שצוינו הן returned_fields , רק השדות האלה מופיעים במאפיין fields של המסמך. אם יצרתם שדות מחושבים על ידי ציון returned_expressions או snippeted_fields , הם יופיעו בנפרד במאפיין expressions של המסמך.

שימוש בהזחות

אם החיפוש מוצא יותר מסמכים מכמות המסמכים שאפשר להחזיר בבת אחת, אפשר להשתמש בהיסט כדי ליצור אינדקס ברשימת המסמכים התואמים. לדוגמה, מגבלת ברירת המחדל של שאילתות היא 20 מסמכים. אחרי שמבצעים חיפוש בפעם הראשונה (עם היסט של 0) ומאחזרים את 20 המסמכים הראשונים, מאחזרים את 20 המסמכים הבאים על ידי הגדרת ההיסט ל-20 והרצת אותו החיפוש שוב. ממשיכים לחזור על החיפוש, ומגדילים בכל פעם את ההיסט במספר המסמכים שמוחזרים:

def query_offset(index, query_string):
    offset = 0

    while True:
        # Build the query using the current offset.
        options = search.QueryOptions(offset=offset)
        query = search.Query(query_string=query_string, options=options)

        # Get the results
        results = index.search(query)

        number_retrieved = len(results.results)
        if number_retrieved == 0:
            break

        # Add the number of documents found to the offset, so that the next
        # iteration will grab the next page of documents.
        offset += number_retrieved

        # Process the matched documents
        for document in results:
            print(document)

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

שימוש בסמנים

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

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

שימוש בסמן לכל שאילתה

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

def query_cursor(index, query_string):
    cursor = search.Cursor()

    while cursor:
        # Build the query using the cursor.
        options = search.QueryOptions(cursor=cursor)
        query = search.Query(query_string=query_string, options=options)

        # Get the results and the next cursor
        results = index.search(query)
        cursor = results.cursor

        for document in results:
            print(document)

שימוש בסמן לכל תוצאה

כדי ליצור סמנים לכל תוצאה, צריך להגדיר את מאפיין הסמן per_result לערך true כשיוצרים את הסמן הראשוני. כשתוצאות החיפוש יחזרו, לכל מסמך יהיה סמן שמשויך אליו. אפשר להשתמש בסמן הזה כדי לציין חיפוש חדש עם תוצאות שמתחילות במסמך ספציפי. שימו לב: כשמעבירים סמן לכל תוצאה לחיפוש, לא יהיה סמן לכל שאילתה שמשויך לתוצאה עצמה. הפונקציה result.getCursor() תחזיר ערך null, כך שאי אפשר להשתמש בה כדי לבדוק אם אחזרתם את כל ההתאמות.

def query_per_document_cursor(index, query_string):
    cursor = search.Cursor(per_result=True)

    # Build the query using the cursor.
    options = search.QueryOptions(cursor=cursor)
    query = search.Query(query_string=query_string, options=options)

    # Get the results.
    results = index.search(query)

    document_cursor = None
    for document in results:
        # discover some document of interest and grab its cursor, for this
        # sample we'll just use the first document.
        document_cursor = document.cursor
        break

    # Start the next search from the document of interest.
    if document_cursor is None:
        return

    options = search.QueryOptions(cursor=document_cursor)
    query = search.Query(query_string=query_string, options=options)
    results = index.search(query)

    for document in results:
        print(document)

שמירה ושחזור של סמנים

אפשר לבצע סריאליזציה של סמן כמחרוזת בטוחה לשימוש באינטרנט, לשמור אותו ואז לשחזר אותו לשימוש מאוחר יותר:

def saving_and_restoring_cursor(cursor):
    # Convert the cursor to a web-safe string.
    cursor_string = cursor.web_safe_string
    # Restore the cursor from a web-safe string.
    cursor = search.Cursor(web_safe_string=cursor_string)