סינון חיפוש בהתאמה אישית של נתונים מובְנים או לא מובְנים (מאמר שמתייחס לגרסה קודמת)

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

לפני שמתחילים

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

דוגמה למטא-נתונים

כדאי לעיין בדוגמה הזו של מטא-נתונים לארבעה קובצי PDF ‏ (document_1.pdf,‏ document_2.pdf,‏ document_3.pdf ו-document_4.pdf). המטא-נתונים האלה יהיו בקובץ JSON בקטגוריה של Cloud Storage, יחד עם קובצי ה-PDF. אפשר לחזור לדוגמה הזו כשקוראים את הדף הזה.

{"id": "1", "structData": {"title": "Policy on accepting corrected claims", "category": ["persona_A"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_1.pdf"}}
{"id": "2", "structData": {"title": "Claims documentation and reporting guidelines for commercial members", "category": ["persona_A", "persona_B"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_2.pdf"}}
{"id": "3", "structData": {"title": "Claims guidelines for bundled services and supplies for commercial members", "category": ["persona_B", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_3.pdf"}}
{"id": "4", "structData": {"title": "Advantage claims submission guidelines", "category": ["persona_A", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_4.pdf"}}

התחביר של ביטוי סינון

חשוב להבין את התחביר של ביטוי המסנן שבו תשתמשו כדי להגדיר את מסנן החיפוש. אפשר לסכם את תחביר הביטוי של המסנן באמצעות הצורה המורחבת של Backus–Naur:

  # 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 exactly matches 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
    # An expression that applies to a geolocation field with text/street/postal address.
    |  geolocation_field, ":", "GEO_DISTANCE(", literal, ",", distance_in_meters, ")"
    # An expression that applies to a geolocation field with latitude and longitude.
    | geolocation_field, ":", "GEO_DISTANCE(", latitude_double, ",", longitude_double, ",", distance_in_meters, ")"
    # Datetime field
    | datetime_field, comparison, literal_iso_8601_datetime_format);
  # 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 = text field - for example, category;
  numerical_field = numerical field - for example, score;
  geolocation_field = field of geolocation data type - for example home_address, location;
  datetime_field = field of datetime data type - for example creation_date, expires_on;
  literal_iso_8601_datetime_format = either a double quoted string representing ISO 8601 datetime or a numerical field representing microseconds from unix epoch.

חיפוש באמצעות מסנן מטא-נתונים

כדי לחפש באמצעות מסנן מטא-נתונים:

  1. קובעים את שדה המטא-נתונים שישמש לסינון שאילתות החיפוש. לדוגמה, כדי לחפש את המטא-נתונים שמופיעים בקטע לפני שמתחילים, אפשר להשתמש בשדה category כמסנן חיפוש. המשתמשים יכולים לסנן לפי persona_A, ‏persona_B או persona_C, כך שהחיפוש שלהם יוגבל למסמכים שמשויכים לדמות שהם מתעניינים בה.

  2. הופכים את שדה המטא-נתונים לניתן לאינדוקס:

    1. במסוף Google Cloud , עוברים לדף Gemini Enterprise ובתפריט הניווט לוחצים על Apps (אפליקציות).

      כניסה לדף האפליקציות

    2. לוחצים על אפליקציית החיפוש.

    3. בתפריט הניווט, לוחצים על נתונים.

    4. לוחצים על הכרטיסייה סכימה. בכרטיסייה הזו מוצגות ההגדרות הנוכחיות של השדות.

    5. לוחצים על Edit.

    6. מסמנים את תיבת הסימון ניתן לאינדוקס בשדה שרוצים להפוך לניתן לאינדוקס.

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

  3. איך מוצאים את המזהה של מאגר הנתונים אם כבר יש לכם מזהה של מאגר נתונים, אפשר לדלג לשלב הבא.

    1. במסוף Google Cloud , עוברים לדף Gemini Enterprise ובתפריט הניווט לוחצים על מאגרי נתונים.

      כניסה לדף Data Stores

    2. לוחצים על השם של מאגר הנתונים.

    3. בדף Data של מאגר הנתונים, מאתרים את מזהה מאגר הנתונים.

  4. תצוגה מקדימה של תוצאות החיפוש.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "filter": "FILTER"
    }'
    

    מחליפים את מה שכתוב בשדות הבאים:

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

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

    "query": "claims",
    "filter": "category: ANY(\"persona_A\")"
    

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

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

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

    {
    "results": [
    {
      "id": "2",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/2",
        "id": "2",
        "structData": {
          "title": "Claims documentation and reporting guidelines for commercial members",
          "category": [
            "persona_A",
            "persona_B"
          ]
        },
        "derivedStructData": {
          "link": "gs://bucketname_87654321/data/document_2.pdf",
          "extractive_answers": [
            {
              "pageNumber": "1",
              "content": "lorem ipsum"
            }
          ]
        }
      }
    },
    {
      "id": "1",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/1",
        "id": "1",
        "structData": {
          "title": "Policy on accepting corrected claims",
          "category": [
            "persona_A"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "2",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_1.pdf"
        }
      }
    },
    {
      "id": "4",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/4",
        "id": "4",
        "structData": {
          "title": "Advantage claims submission guidelines",
          "category": [
            "persona_A",
            "persona_C"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "47",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_4.pdf"
        }
      }
    }
    ],
    "totalSize": 330,
    "attributionToken": "UvBRCgsI26PxpQYQs7vQZRIkNjRiYWY1MTItMDAwMC0yZWIwLTg3MTAtMTQyMjNiYzYzMWEyIgdHRU5FUklDKhSOvp0VpovvF8XL8xfC8J4V1LKdFQ",
    "guidedSearchResult": {},
    "summary": {}
    }
    

דוגמאות לביטויי סינון

בטבלה הבאה מופיעות דוגמאות לביטויי סינון.

מסנן הפונקציה מחזירה תוצאות רק עבור מסמכים שבהם:
category: ANY(\"persona_A\") שדה הטקסט category הוא persona_A
score: IN(*, 100.0e) הערך בשדה המספרי score גדול ממינוס אינסוף וקטן מ-100.0
non-smoking = \"true\" הערך הבוליאני non-smoking הוא true
pet-friendly = \"false\" הערך הבוליאני pet-friendly הוא False
manufactured_date = \"2023\" הערך של manufactured date הוא כל שעה בשנת 2023
manufactured_date >= \"2024-04-16\" התאריך manufactured_date הוא 16 באפריל 2024 או אחריו
manufactured_date < \"2024-04-16T12:00:00-07:00\" השעה manufactured_date היא לפני הצהריים לפי שעון החוף הפסיפי (PDT) ב-16 באפריל 2024
office.location:GEO_DISTANCE(\"1600 Amphitheater Pkwy, Mountain View, CA, 94043\", 500) השדה של המיקום הגיאוגרפי office.location נמצא במרחק של עד 500 מטר מכתובת 1600 Amphitheater Pkwy
NOT office.location:GEO_DISTANCE(\"Palo Alto, CA\", 1000) השדה של המיקום הגיאוגרפי office.location לא נמצא ברדיוס של קילומטר אחד מפאלו אלטו, קליפורניה.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) השדה של המיקום הגיאוגרפי office.location נמצא ברדיוס של 500 מטר מקו הרוחב 34.1829 וקו האורך ‎-121.293
category: ANY(\"persona_A\") AND score: IN(*, 100.0e) הערך של category הוא persona_A והערך של score קטן מ-100
office.location:GEO_DISTANCE(\"Mountain View, CA\", 500) OR office.location:GEO_DISTANCE(\"Palo Alto, CA\", 500) office.location נמצא במרחק של עד 500 מטר ממאונטיין ויו או מפאלו אלטו.
(price<175 AND pet-friendly = \"true\") OR (price<125 AND pet-friendly = \"false\") המשקל של price הוא פחות מ-175 ואני יכול/ה להביא את חיית המחמד שלי, או שהמשקל של price הוא פחות מ-125 ואני לא יכול/ה להביא את חיית המחמד שלי

המאמרים הבאים

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