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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{
  "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 – מציין שאפשר להשתמש במאפיין כדי ליצור היבטים. היבט משמש לשיפור תוצאות החיפוש. המשתמש רואה את התוצאות הראשוניות ואז מוסיף קריטריונים, או היבטים, כדי לשפר עוד יותר את התוצאות האלה. אי אפשר להגדיר את האפשרות הזו כ-true לנכסים שהסוג שלהם הוא אובייקט, וצריך להגדיר את האפשרות isReturnable כ-true כדי להגדיר את האפשרות הזו. לבסוף, האפשרות הזו נתמכת רק עבור נכסי enum,‏ boolean וטקסט. לדוגמה, בסכימה לדוגמה שלנו, יכול להיות שנגדיר את genre, ‏ actorName, ‏ userRating ו-mpaaRating כמאפיינים שניתן לסנן לפיהם, כדי לאפשר שימוש בהם לסינון אינטראקטיבי של תוצאות החיפוש.
  • isWildcardSearchable מציין שהמשתמשים יכולים לבצע חיפוש עם תווים כלליים במאפיין הזה. האפשרות הזו זמינה רק בנכסי טקסט. האופן שבו מתבצע חיפוש עם תו כללי בשדה הטקסט תלוי בערך שמוגדר בשדה exactMatchWithOperator. אם הערך של exactMatchWithOperator הוא true, ערך הטקסט עובר טוקניזציה כערך אטומי אחד, ומתבצע חיפוש עם תו כללי. לדוגמה, אם ערך הטקסט הוא science-fiction, שאילתת תו כללי science-* תתאים לו. אם exactMatchWithOperator מוגדר לערך false, ערך הטקסט עובר טוקניזציה ומתבצע חיפוש עם תו כללי לחיפוש לכל טוקן. לדוגמה, אם ערך הטקסט הוא 'מדע בדיוני', שאילתות עם התו הכללי 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

גם genre וגם actorName מוגדרים עם הערך isRepeatable שהוא 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, מחרוזת השאילתה צריכה להיות זהה לערך המאפיין כולו, ולא רק להיות חלק מהטקסט. ערך הטקסט יתפרש כערך אטומי אחד בחיפושים עם אופרטורים ובהתאמות של היבטים.

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

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

בסוף כל קטע propertyDefinition יש קטע אופציונלי displayOptions. הקטע הזה מכיל מחרוזת אחת של 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[] קטע

בסוף כל קטע propertyDefinition יש קטע suggestionFilteringOperators[] אופציונלי. בקטע הזה מגדירים מאפיין שמשמש לסינון הצעות להשלמה אוטומטית. לדוגמה, אפשר להגדיר את האופרטור של 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. האינדוקס מתבצע בדרך כלל במחבר התוכן.

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

{
  "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 ולוחצים על Return. כל הסרטים עם המילה 'טיטניק' צריכים להופיע בתוצאות החיפוש.

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

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

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

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

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

יצירת אינדקס מחדש אחרי שינוי בסכימה

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

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

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

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

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

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

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

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

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

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

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

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

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

כדי לשנות את סוג הנתונים או את השם של מאפיין:

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

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

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

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

מידע על מגבלות הגודל

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

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

השלבים הבאים

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

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

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

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

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

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