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

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

(אופציונלי) מוסיפים את הקטע 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"
  }
},

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

נכס 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. יוצרים מחבר.