יצירה ורישום של סכימה

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

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

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

יצירה של סכימה

לפניכם רשימת השלבים ליצירת הסכימה של Cloud Search:

  1. זיהוי התנהגות המשתמשים הצפויה
  2. איך מאתחלים מקור נתונים
  3. יצירת סכימה
  4. סכימה מלאה לדוגמה
  5. רישום הסכימה
  6. הוספת הנתונים לאינדקס
  7. בדיקת הסכימה
  8. התאמת הסכימה

זיהוי התנהגות המשתמשים הצפויה

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

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

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

  1. הערכה של קבוצה מגוונת של שאילתות רצויות ממשתמשים שונים.
  2. מזהים את האובייקטים שעשויים לשמש בשאילתות. אובייקטים הם קבוצות לוגיות של נתונים קשורים, כמו סרט במסד נתונים של סרטים.
  3. זיהוי המאפיינים והערכים שמרכיבים את האובייקט ויכולים לשמש בשאילתות. מאפיינים הם המאפיינים של האובייקט שאפשר להוסיף לאינדקס. הם יכולים לכלול ערכים פרימיטיביים או אובייקטים אחרים. לדוגמה, לאובייקט של סרט יכולים להיות נכסים כמו שם הסרט ותאריך הפרסום שלו כערכים פרימיטיביים. אובייקט הסרט עשוי להכיל גם אובייקטים אחרים, כמו שחקנים, שיש להם מאפיינים משלהם, כמו השם או התפקיד שלהם.
  4. זיהוי דוגמאות לערכים חוקיים למאפיינים. ערכים הם הנתונים בפועל שנוספו לאינדקס של נכס. לדוגמה, שם של סרט אחד במסד הנתונים יכול להיות "שודדי הארץ האבודה".
  5. כדאי לקבוע אילו אפשרויות מיון ודירוג המשתמשים שלכם רוצים. לדוגמה, כשמשתמשים שולחים שאילתה לגבי סרטים, יכול להיות שהם רוצים למיין לפי תאריך פרסום ולדרג לפי דירוג הצופים, ולא צריכים למיין לפי שם הסרט לפי סדר אלפביתי.
  6. (אופציונלי) כדאי לבדוק אם אחד מהנכסים מייצג הקשר ספציפי יותר שבו יכולות להתבצע חיפושים, כמו תפקיד או מחלקה של המשתמשים, כדי שניתן יהיה לספק הצעות להשלמה אוטומטית על סמך ההקשר. לדוגמה, אנשים שמחפשים במסד נתונים של סרטים עשויים להתעניין רק בז'אנר מסוים של סרטים. המשתמשים יוכלו להגדיר את הז'אנר שהם רוצים שהחיפושים שלהם יחזירו, אולי כחלק מפרופיל המשתמש שלהם. לאחר מכן, כשהמשתמש מתחיל להקליד שאילתה לגבי סרטים, רק סרטים בז'אנר המועדף עליו, כמו 'סרטי פעולה', יוצגו כחלק מההצעות להשלמה אוטומטית.
  7. עליכם ליצור רשימה של האובייקטים, המאפיינים והערכים לדוגמה האלה שאפשר להשתמש בהם בחיפושים. (פרטים על אופן השימוש ברשימה הזו מופיעים בקטע הגדרת אפשרויות של אופרטורים).

איך מאתחלים את מקור הנתונים

מקור נתונים מייצג את הנתונים מהמאגר שנוספו לאינדקס ונשמרו ב-Google Cloud. הוראות להפעלת מקור נתונים מפורטות במאמר ניהול מקורות נתונים של צד שלישי.

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

הגדרת האובייקטים

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

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

באיור 1 מוצגים אובייקטים של סרט ואדם, וגם המאפיינים המשויכים.

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

סכימה של Cloud Search היא למעשה רשימה של הצהרות לגבי הגדרת אובייקטים שמוגדרות בתג objectDefinitions. קטע הקוד הבא של הסכימה מציג את הצהרות ה-objectDefinitions לאובייקטים של הסכימה movie ו-person.

{
  "objectDefinitions": [
    {
      "name": "movie",
      ...
    },
    {
      "name": "person",
      ...
    }
  ]
}

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

הגדרת מאפייני אובייקטים

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

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

קטע הקוד הבא מציג את האובייקט movie עם שני מאפיינים: movieTitle ו-releaseDate.

{
  "objectDefinitions": [
    {
      "name": "movie",
      "propertyDefinitions": [
        {
          "name": "movieTitle",
          "isReturnable": true,
          "isWildcardSearchable": true,
          "textPropertyOptions": {
            "retrievalImportance": { "importance": "HIGHEST" },
            "operatorOptions": {
              "operatorName": "title"
            }
          },
          "displayOptions": {
            "displayLabel": "Title"
          }
        },
        {
          "name": "releaseDate",
          "isReturnable": true,
          "isSortable": true,
          "datePropertyOptions": {
            "operatorOptions": {
              "operatorName": "released",
              "lessThanOperatorName": "releasedbefore",
              "greaterThanOperatorName": "releasedafter"
            }
          },
          "displayOptions": {
            "displayLabel": "Release date"
          }
      ...
      ]
    }
  ]
}

האובייקט PropertyDefinition מורכב מהפריטים הבאים:

  • מחרוזת name.
  • רשימה של אפשרויות ללא קשר לסוג, כמו isReturnable בקטע הקוד הקודם.
  • סוג והאפשרויות הספציפיות לסוג, כמו textPropertyOptions ו-retrievalImportance בקטע הקוד הקודם.
  • operatorOptions שמתאר את אופן השימוש במאפיין כאופרטור חיפוש.
  • displayOptions אחד או יותר, כמו displayLabel בקטע הקוד הקודם.

השם name של נכס חייב להיות ייחודי בתוך האובייקט המכיל, אבל אפשר להשתמש באותו שם באובייקטים אחרים ובאובייקטים משנה. באיור 1, שם הסרט ותאריך הפרסום שלו מוגדרים פעמיים: פעם אחת באובייקט movie ופעם נוספת באובייקט המשנה filmography של האובייקט person. בסכימה הזו נעשה שימוש חוזר בשדה movieTitle כדי שהסכימה תוכל לתמוך בשני סוגים של התנהגויות חיפוש:

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

באופן דומה, הסכימה משתמשת שוב בשדה releaseDate כי יש לו אותו משמעות בשני השדות movieTitle.

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

הוספת אפשרויות ללא תלות בסוג

ב-PropertyDefinition מפורטות אפשרויות כלליות של פונקציונליות חיפוש שקיימות בכל הנכסים, ללא קשר לסוג הנתונים.

  • isReturnable – מציין אם הנכס מזהה נתונים שצריך להחזיר בתוצאות החיפוש דרך Query API. אפשר להחזיר את כל נכסי הסרטים לדוגמה. אפשר להשתמש בנכסים שלא ניתן להחזיר כדי לחפש או לדרג תוצאות בלי להחזיר אותם למשתמש.
  • isRepeatable – מציין אם מותר להזין כמה ערכים למאפיין. לדוגמה, לסרט יש רק תאריך יציאה אחד, אבל יכולים להיות בו כמה שחקנים.
  • isSortable – מציין שאפשר להשתמש במאפיין למטרות מיון. הדבר לא יכול להיות נכון לגבי נכסים שניתן לחזור עליהם. לדוגמה, תוצאות של סרטים יכולות להיות ממוינות לפי תאריך פרסום או לפי סיווג גיל.
  • isFacetable – מציין שאפשר להשתמש במאפיין ליצירת היבטים. פנים משמש לצמצום תוצאות החיפוש. המשתמש רואה את התוצאות הראשוניות ואז מוסיף קריטריונים או פנים כדי לצמצם את התוצאות עוד יותר. אי אפשר להגדיר את האפשרות הזו כנכונה למאפיינים שהסוג שלהם הוא אובייקט, וגם הערך של isReturnable חייב להיות נכון. לבסוף, האפשרות הזו נתמכת רק בנכסי enum, בנכסים בוליאניים ובנכסי טקסט. לדוגמה, אפשר להגדיר את השדות genre,‏ actorName,‏ userRating ו-mpaaRating כטבלאות פנים (facetable) כדי שאפשר יהיה להשתמש בהם לצמצום אינטראקטיבי של תוצאות החיפוש.
  • הערך isWildcardSearchable מציין שהמשתמשים יכולים לבצע חיפוש באמצעות תווים כלליים בנכס הזה. האפשרות הזו זמינה רק בנכסי טקסט. האופן שבו חיפוש תווים כלליים פועל בשדה הטקסט תלוי בערך שמוגדר בשדה exactMatchWithOperator. אם הערך של exactMatchWithOperator מוגדר כ-true, ערך הטקסט מומר לאסימונים כערך אטומי אחד ומתבצע חיפוש תו כללי לחיפוש (wildcard) נגדו. לדוגמה, אם ערך הטקסט הוא science-fiction, שאילתת תו כללי לחיפוש science-* תואמת לו. אם exactMatchWithOperator מוגדר ל-false, ערך הטקסט מומר לאסימונים ומתבצע חיפוש תו כללי לכל אסימון. לדוגמה, אם ערך הטקסט הוא 'science-fiction', שאילתות התו הכללי sci* או fi* תואמות לפריט, אבל science-* לא תואמת לו.

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

בטבלה הבאה מוצגים הפרמטרים הבוליאניים שמוגדרים ל-true לכל המאפיינים של האובייקט movie:

נכס isReturnable isRepeatable isSortable isFacetable isWildcardSearchable
movieTitle TRUE TRUE
releaseDate TRUE TRUE
genre TRUE TRUE TRUE
duration TRUE
actorName TRUE TRUE TRUE TRUE
userRating TRUE TRUE
mpaaRating TRUE TRUE

הערך של isRepeatable בשדות genre ו-actorName מוגדר כ-true כי סרט יכול להשתייך ליותר מז'אנר אחד ובדרך כלל יש בו יותר משחקן אחד. אי אפשר למיין נכס אם הוא ניתן לחזור עליו או אם הוא נכלל באובייקט משנה שניתן לחזור עליו.

הגדרת סוג

בקטע העזרה PropertyDefinition מפורטים כמה xxPropertyOptions שבהם xx הוא סוג ספציפי, כמו boolean. כדי להגדיר את סוג הנתונים של המאפיין, צריך להגדיר את אובייקט סוג הנתונים המתאים. הגדרת אובייקט של סוג נתונים למאפיין מגדירה את סוג הנתונים של אותו מאפיין. לדוגמה, הגדרת הערך textPropertyOptions לנכס movieTitle מציינת שהכותרת של הסרט היא מסוג טקסט. בקטע הקוד הבא מוצג המאפיין movieTitle עם textPropertyOptions שמגדיר את סוג הנתונים.

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    ...
  },
  ...
},

לכל נכס יכול להיות רק סוג נתונים אחד משויך. לדוגמה, בסכימה של הסרטים, השדה releaseDate יכול להכיל רק תאריך (למשל, 2016-01-13) או מחרוזת (למשל, January 13, 2016), אבל לא את שתיהן.

אלה אובייקטים של סוגים של נתונים שמשמשים לציון סוגי הנתונים של המאפיינים בהסכימה לדוגמה של הסרט:

נכס אובייקט של סוג נתונים
movieTitle textPropertyOptions
releaseDate datePropertyOptions
genre enumPropertyOptions
duration textPropertyOptions
actorName textPropertyOptions
userRating integerPropertyOptions
mpaaRating textPropertyOptions

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

הגדרת אפשרויות ספציפיות לסוג

בקטע העזרה PropertyDefinition יש קישורים לאפשרויות לכל סוג. רוב האפשרויות הספציפיות לסוג הן אופציונליות, מלבד הרשימה של possibleValues בקטע enumPropertyOptions. בנוסף, האפשרות orderedRanking מאפשרת לדרג ערכים ביחס זה לזה. קטע הקוד הבא מציג את המאפיין movieTitle עם textPropertyOptions שמגדיר את סוג הנתונים ועם האפשרות הספציפית לסוג retrievalImportance.

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    ...
  },
  ...
}

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

נכס סוג אפשרויות ספציפיות לסוג
movieTitle textPropertyOptions retrievalImportance
releaseDate datePropertyOptions
genre enumPropertyOptions
duration textPropertyOptions
actorName textPropertyOptions
userRating integerPropertyOptions orderedRanking, maximumValue
mpaaRating textPropertyOptions

הגדרת אפשרויות של אופרטורים

בנוסף לאפשרויות ספציפיות לסוג, לכל סוג יש קבוצה של אפשרויות operatorOptions אופציונליות. האפשרויות האלה מתארות את אופן השימוש במאפיין כאופרטור חיפוש. בקטע הקוד הבא מוצג הנכס movieTitle עם ההגדרה textPropertyOptions של סוג הנתונים, ועם האפשרויות הספציפיות לסוג retrievalImportance ו-operatorOptions.

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    "operatorOptions": {
      "operatorName": "title"
    }
  },
  ...
}

לכל operatorOptions יש operatorName, למשל title ל-movieTitle. שם המפעיל הוא אופרטור החיפוש של הנכס. אופרטור חיפוש הוא הפרמטר בפועל שבו אתם מצפים שהמשתמשים ישתמשו כדי לצמצם את החיפוש. לדוגמה, כדי לחפש סרטים לפי השם שלהם, המשתמש צריך להקליד title:movieName, כאשר movieName הוא שם הסרט.

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

אפשר להשתמש באותו שם אופרטור בכמה נכסים, כל עוד כל הנכסים מנותבים לאותו סוג. כשמשתמשים בשם אופרטור משותף במהלך שאילתת חיפוש, כל הנכסים שמשתמשים בשם האופרטור הזה מאוחזרים. לדוגמה, נניח שלאובייקט הסרט היו המאפיינים plotSummary ו-plotSynopsis, ושלכל אחד מהמאפיינים האלה היה operatorName של plot. כל עוד שני המאפיינים האלה הם טקסט (textPropertyOptions), שאילתה אחת עם אופרטור החיפוש plot תשחזר את שניהם.

בנוסף ל-operatorName, נכסים שאפשר למיין אותם יכולים לכלול את השדות lessThanOperatorName ו-greaterThanOperatorName ב-operatorOptions. המשתמשים יכולים להשתמש באפשרויות האלה כדי ליצור שאילתות שמבוססות על השוואות לערך שנשלח.

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

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

(אופציונלי) מוסיפים את הקטע displayOptions

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

בקטע הקוד הבא מוצג המאפיין movieTitle עם displayLabel שהוגדר לערך 'Title'.

{
  "name": "movieTitle",
  "isReturnable": true,
  "isWildcardSearchable": true,
  "textPropertyOptions": {
    "retrievalImportance": { "importance": "HIGHEST" },
    "operatorOptions": {
       "operatorName": "title"
    }
},
  "displayOptions": {
    "displayLabel": "Title"
  }
},

בהמשך מפורטים ערכי displayLabel לכל המאפיינים של האובייקט movie בסכימה לדוגמה:

נכס displayLabel
movieTitle Title
releaseDate Release date
genre Genre
duration Run length
actorName Actor
userRating Audience score
mpaaRating MPAA rating

(אופציונלי) מוסיפים את הקטע suggestionFilteringOperators[]

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

רישום הסכימה

כדי לקבל נתונים מובְנים מהשאילתות של Cloud Search, צריך לרשום את הסכימה בשירות הסכימה של Cloud Search. כדי לרשום סכמה, צריך את מזהה מקור הנתונים שקיבלתם בשלב הפעלת מקור נתונים.

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

כפי שמפורט בדף העזרה UpdateSchema, שולחים את בקשת ה-HTTP הבאה כדי לרשום את הסכימה:

PUT https://cloudsearch.googleapis.com/v1/indexing/{name=datasources/*}/schema

גוף הבקשה צריך לכלול את הפרטים הבאים:

{
  "validateOnly": // true or false,
  "schema": {
    // ... Your complete schema object ...
  }
}

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

הוספת הנתונים לאינדקס

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

באמצעות הסכימה של הסרט, בקשת הוספה לאינדקס של API ל-REST לסרט אחד תיראה כך:

{
  "name": "datasource/<data_source_id>/items/titanic",
  "acl": {
    "readers": [
      {
        "gsuitePrincipal": {
          "gsuiteDomain": true
        }
      }
    ]
  },
  "metadata": {
    "title": "Titanic",
    "sourceRepositoryUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
    "objectType": "movie"
  },
  "structuredData": {
    "object": {
      "properties": [
        {
          "name": "movieTitle",
          "textValues": {
            "values": [
              "Titanic"
            ]
          }
        },
        {
          "name": "releaseDate",
          "dateValues": {
            "values": [
              {
                "year": 1997,
                "month": 12,
                "day": 19
              }
            ]
          }
        },
        {
          "name": "actorName",
          "textValues": {
            "values": [
              "Leonardo DiCaprio",
              "Kate Winslet",
              "Billy Zane"
            ]
          }
        },
        {
          "name": "genre",
          "enumValues": {
            "values": [
              "Drama",
              "Action"
            ]
          }
        },
        {
          "name": "userRating",
          "integerValues": {
            "values": [
              8
            ]
          }
        },
        {
          "name": "mpaaRating",
          "textValues": {
            "values": [
              "PG-13"
            ]
          }
        },
        {
          "name": "duration",
          "textValues": {
            "values": [
              "3 h 14 min"
            ]
          }
        }
      ]
    }
  },
  "content": {
    "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
    "contentFormat": "TEXT"
  },
  "version": "01",
  "itemType": "CONTENT_ITEM"
}

שימו לב שהערך של movie בשדה objectType תואם לשם של הגדרת האובייקט בסכימה. ההתאמה בין שני הערכים האלה מאפשרת ל-Cloud Search לדעת באיזה אובייקט הסכימה להשתמש במהלך ההוספה לאינדקס.

שימו לב גם לאופן שבו ההוספה של מאפיין הסכימה releaseDate לאינדקס מתבססת על מאפייני המשנה של year, ‏ month ו-day, שהם עוברים בירושה כי הוא מוגדר כסוג נתונים date באמצעות השימוש ב-datePropertyOptions להגדרה שלו. עם זאת, מאחר שהמאפיינים year,‏ month ו-day לא מוגדרים בהסכימה, אי אפשר להריץ שאילתות לגבי אחד מהמאפיינים האלה (למשל, year) בנפרד.

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

זיהוי בעיות אפשריות בהוספה לאינדקס

שתי הבעיות הנפוצות ביותר שקשורות לסכמות ולהוספה לאינדקס הן:

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

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

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

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

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

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

בדיקה באמצעות שאילתה כללית

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

בדיקה עם אופרטור

הוספת אופרטור לשאילתה מגבילה את התוצאות לפריטים שתואמים לערך האופרטור. לדוגמה, אפשר להשתמש באופרטור actor כדי למצוא את כל הסרטים שבהם מככב שחקן ספציפי. בממשק חיפוש, אפשר להריץ את שאילתה האופרטור הזו פשוט על ידי הקלדה של צמד operator=value, כמו "actor:Zane", והקשה על Enter. כל הסרטים שבהם Zane משחק צריכים להופיע בתוצאות החיפוש.

כוונון הסכימה

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

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

הוספה מחדש לאינדקס אחרי שינוי בסכימה

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

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

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

  • הוספה או הסרה של נכס או אובייקט חדשים
  • שינוי הערכים של isReturnable,‏ isFacetable או isSortable מ-false ל-true.

צריך להגדיר את isFacetable או isSortable כ-true רק אם יש לכם תרחיש לדוגמה וצרך ברור.

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

שינויים אסורים בנכס

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

  • סוג הנתונים של הנכס.
  • שם הנכס.
  • ההגדרה exactMatchWithOperator.
  • ההגדרה retrievalImportance.

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

ביצוע שינוי מורכב בסכימה

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

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

כך משנים את סוג הנתונים או את השם של נכס:

  1. מוסיפים מאפיין חדש להגדרת האובייקט בסכימה. צריך להשתמש בשם שונה מהנכס שרוצים לשנות.
  2. שולחים את הבקשה UpdateSchema עם ההגדרה החדשה. חשוב לזכור לשלוח את כל הסכימה, כולל הנכס החדש והישן, בבקשה.
  3. מילוי חוסרים (backfill) של האינדקס ממאגר הנתונים. כדי למלא את האינדקס, שולחים את כל הבקשות להוספה לאינדקס באמצעות הנכס החדש, אבל לא באמצעות הנכס הישן, כי הדבר יוביל לספירה כפולה של התאמות לשאילתות.

    1. במהלך מילוי החסר של הנכס ב-Index, צריך לבדוק אם הנכס החדש קיים ולהגדיר כברירת מחדל את הנכס הישן כדי למנוע התנהגות לא עקבית.
    2. אחרי השלמת המילוי, מריצים שאילתות בדיקה כדי לוודא שהכול תקין.
  4. מוחקים את הנכס הישן. שולחים בקשה נוספת של UpdateSchema בלי שם הנכס הישן, ומפסיקים להשתמש בשם הנכס הישן בבקשות נוספות להוספה לאינדקס.

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

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

מגבלות הגודל

ב-Cloud Search יש מגבלות על הגודל של אובייקטים וסכימות של נתונים מובְנים. המגבלות האלה הן:

  • המספר המקסימלי של אובייקטים ברמה העליונה הוא 10 אובייקטים.
  • העומק המקסימלי של היררכיית נתונים מובְנים הוא 10 רמות.
  • המספר הכולל של השדות באובייקט מוגבל ל-1,000, כולל מספר השדות הפרימיטיביים וסכום מספר השדות בכל אובייקט בתצוגת עץ.

השלבים הבאים

הנה כמה שלבים אפשריים:

  1. יוצרים ממשק חיפוש כדי לבדוק את הסכימה.

  2. לשפר את הסכימה כדי לשפר את איכות החיפוש.

  3. מבנה של סכימה לצורך פרשנות אופטימלית של שאילתות

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

  5. יוצרים מחבר.