אם יש לכם אפליקציית חיפוש שמשתמשת בנתונים מובְנים או בנתונים לא מובְנים עם מטא-נתונים, אתם יכולים להשתמש במטא-נתונים כדי לסנן את שאילתות החיפוש. בדף הזה מוסבר איך משתמשים בשדות של מטא-נתונים כדי להגביל את החיפוש לקבוצה מסוימת של מסמכים.
דוגמה למטא-נתונים
כדאי לעיין בדוגמה הזו של מטא-נתונים לארבעה קובצי 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 any indexable field. # Preview: Function "EXISTS" returns true if the field is not NULL, empty, or containing the default value. | text_field, ":", "EXISTS" | numerical_field, ":", "EXISTS" # Function "CONTAINS" returns true if the field contains the tokens in any of the literals. # This is a partial match, not an exact match. | text_field, ":", "CONTAINS", "(", literal, ")" # Function "STARTS_WITH" returns true if the field begins with the same characters # as in any of the literals. The prefix matches up to 12 characters. | text_field, ":", "STARTS_WITH", "(", 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.
מאפיינים מרכזיים שתומכים בסינון
גם אם שדה מאפיין מפתח מוגדר כניתן לאינדוקס, יכול להיות שהוא לא תומך בסינון, בהיבטים ובמיון. לדוגמה, אי אפשר לסנן לפי שדה שממופה למאפיין המפתח title.
אפשר להשתמש בשדות המאפיינים הבאים של מפתח לסינון, ליצירת היבטים ולשינוי הסדר.
שדות מאפיינים מרכזיים לחיפוש מותאם אישית שאפשר להשתמש בהם במסננים, בהיבטים ובמיון:
CATEGORIES(category)CREATE_TIME(create_time)HASHTAGS(hashtag)LANGUAGE_CODE(language_code)UPDATE_TIME(update_time)URI(uri)
שדות מרכזיים של מאפיינים לחיפוש מדיה שאפשר להשתמש בהם במסננים, בהיבטים ובמיון:
MEDIA_AVAILABLE_TIME(media_available_time)MEDIA_CONTENT_INDEX(media_content_index)MEDIA_CONTENT_RATING(media_content_rating)MEDIA_COUNTRY_OF_ORIGIN(media_country_of_origin)MEDIA_DURATION(media_duration)MEDIA_EXPIRE_TIME(media_expire_time)MEDIA_FILTER_TAGS(media_filter_tag)MEDIA_HASH_TAGS(media_hash_tag)MEDIA_IN_LANGUAGES(media_in_language)MEDIA_LIVE_EVENT_END_TIME(media_live_event_end_time)MEDIA_LIVE_EVENT_START_TIME(media_live_event_start_time)MEDIA_PRODUCTION_YEAR(media_production_year)MEDIA_TYPE(media_type)
לפני שמתחילים
מוודאים שיצרתם אפליקציה והעברתם נתונים מובְנים או נתונים לא מובְנים עם מטא-נתונים. מידע נוסף זמין במאמר בנושא יצירת אפליקציית חיפוש.
חיפוש באמצעות מסנן מטא-נתונים
כדי לחפש באמצעות מסנן מטא-נתונים:
קובעים את שדה המטא-נתונים שבו רוצים להשתמש לסינון שאילתות החיפוש.
לדוגמה, כדי לסנן את המטא נתונים שמופיעים בקטע לפני שמתחילים, אפשר להשתמש בשדה
category. כשמסננים נתונים מובְנים, כמו בדוגמה של מטא-נתונים, צריך לציין את הנתיב המלא לשדה:structData.category. לאחר מכן, המשתמשים יוכלו לסנן לפיpersona_A,persona_Bאוpersona_C, כך שהחיפוש שלהם יוגבל למסמכים שמשויכים לדמות שהם מתעניינים בה.הופכים את שדה המטא-נתונים לניתן לאינדוקס:
נכנסים לדף AI Applications במסוף Google Cloud ובתפריט הניווט לוחצים על Apps.
לוחצים על אפליקציית החיפוש.
בתפריט הניווט, לוחצים על נתונים.
לוחצים על הכרטיסייה סכימה. בכרטיסייה הזו מוצגות ההגדרות הנוכחיות של השדה.
לוחצים על Edit.
מסמנים את תיבת הסימון ניתן לאינדוקס בשדה שרוצים להפוך לניתן לאינדוקס.
לוחצים על Save. מידע נוסף מופיע במאמר בנושא הגדרת שדות.
מאתרים את מזהה האפליקציה. אם כבר יש לכם מזהה אפליקציה, דלגו לשלב הבא.
נכנסים לדף AI Applications במסוף Google Cloud .
בדף אפליקציות, מאתרים את שם האפליקציה ומעתיקים את המזהה שלה מהעמודה מזהה.
מקבלים תוצאות חיפוש.
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \ -d '{ "query": "QUERY", "filter": "FILTER" }'מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט. -
APP_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 |
category: EXISTS |
שדה הטקסט category מכיל ערך שאינו NULL, כלומר הוא מכיל את הטקסט 1 |
score: EXISTS |
השדה המספרי score מכיל ערך שאינו NULL, כלומר ערך שאינו אפס 1 |
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 ואני לא יכול/ה להביא את חיית המחמד שלי |
zone: STARTS_WITH("asia-") |
שדה הטקסט zone מתחיל ב-asia-, למשל asia-south1-a או asia-east1-c.הערה: האופרטור STARTS_WITH נמצא בגרסת Preview. מידע נוסף מופיע במאמר בנושא הפיכת שדות לזמינים להתאמה לפי קידומת ולהתאמה חלקית (גרסת Preview). |
region: CONTAINS("Europe") |
שדה הטקסט region מכיל את האסימון Europe, כמו Central Europe או Eastern Europe.הערה: האופרטור CONTAINS נמצא בגרסת טרום-השקה. מידע נוסף מופיע במאמר בנושא הפיכת שדות לזמינים להתאמה לפי קידומת ולהתאמה חלקית (גרסת Preview). |
url: CONTAINS("WWW.altostrat.com") |
הביטוי הזה שווה ל-CONTAINS("www") AND CONTAINS("altostrat") AND CONTAINS("com"). הוא תואם לערך השדה www.altostrat.com וגם לווריאציות כמו www.altostrat.com/help. הערה: האופרטור CONTAINS נמצא בגרסת טרום-השקה. מידע נוסף מופיע במאמר בנושא הפיכת שדות לזמינים להתאמה לפי קידומת ולהתאמה חלקית (גרסת Preview). |
email: CONTAINS("info@CymbalGroup.com") |
הביטוי הזה שווה ל-CONTAINS("info") AND CONTAINS("cymbalgroup") AND CONTAINS("com") AND CONTAINS("info@cymbalgroup.com"). בגלל ההתנהגות המיוחדת של המפריד @, הביטוי הזה מתאים לערך השדה info+sales@cymbalgroup.com וגם לערך (הצפוי) info@cymbalgroup.com. הערה: האופרטור CONTAINS נמצא בגרסת טרום-השקה. מידע נוסף מופיע במאמר בנושא הפיכת שדות לזמינים להתאמה לפי קידומת ולהתאמה חלקית (גרסת Preview). |
המאמרים הבאים
- כדי להבין את ההשפעה של המסננים על איכות החיפוש, צריך להעריך את איכות החיפוש. מידע נוסף מפורט במאמר בנושא הערכת איכות החיפוש.