מחבר תוכן הוא תוכנה שסורקת נתונים במאגר ארגוני ומאכלסת מקור נתונים. Google מספקת את האפשרויות הבאות לפיתוח מחברי תוכן:
SDK של מחבר תוכן. האפשרות הזו מתאימה למתכנתי Java. ה-SDK הוא wrapper סביב API בארכיטקטורת REST שמאפשר ליצור מחברים במהירות. כדי ליצור מחבר תוכן באמצעות ה-SDK, אפשר לעיין במאמר יצירת מחבר תוכן באמצעות Content Connector SDK.
API בארכיטקטורת REST ברמה נמוכה או ספריות API. כדאי להשתמש באפשרויות האלה אם אתם לא משתמשים ב-Java או אם בסיס הקוד שלכם מתאים יותר ל-API בארכיטקטורת REST או לספרייה. כדי ליצור מחבר תוכן באמצעות ה-API בארכיטקטורת REST, אפשר לעיין במאמר בנושא יצירת מחבר תוכן באמצעות ה-API בארכיטקטורת REST.
מחבר תוכן טיפוסי מבצע את המשימות הבאות:
- קריאה ועיבוד של פרמטרים של הגדרות.
- שולף נתונים נפרדים שניתנים להוספה לאינדקס, שנקראים פריטים, ממאגר של צד שלישי.
- משלב רשימות ACL, מטא-נתונים ונתוני תוכן לפריטים שניתן להוסיף לאינדקס.
- הוספת פריטים לאינדקס במקור הנתונים של Cloud Search.
- (אופציונלי) האפליקציה מאזינה להתראות על שינויים במאגר. שינויים בהתראות הופכים לבקשות לאינדוקס כדי לשמור על סנכרון מקור הנתונים של Cloud Search. המחבר מבצע את המשימה הזו רק אם המאגר תומך בזיהוי שינויים.
יצירת מחבר תוכן באמצעות Content Connector SDK
בקטעים הבאים מוסבר איך ליצור מחבר תוכן באמצעות Content Connector SDK.
הגדרת יחסי תלות
כוללים את התלויות האלה בקובץ ה-build.
Maven
xml
<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-indexing-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>
Gradle
groovy
compile group: 'com.google.enterprise.cloudsearch',
name: 'google-cloudsearch-indexing-connector-sdk',
version: 'v1-0.0.3'
יצירת הגדרות למחבר
כל מחבר משתמש בקובץ הגדרה לפרמטרים כמו מזהה המאגר.
מגדירים פרמטרים כצמדי מפתח/ערך, כמו
api.sourceId=1234567890abcdef.
ערכת ה-SDK של Google Cloud Search כוללת פרמטרים שסופקו על ידי Google לכל המחברים. עליך להצהיר על הפרטים הבאים בקובץ התצורה:
- מחבר תוכן: צריך להצהיר על
api.sourceIdועלapi.serviceAccountPrivateKeyFile. הם מזהים את המאגר ואת המפתח הפרטי שנדרש לגישה.
- מחבר זהויות: צריך להצהיר על
api.identitySourceIdכדי לזהות את מקור הזהויות החיצוני. לסנכרון משתמשים, צריך גם להצהיר עלapi.customerId(המזהה הייחודי של חשבון Google Workspace).
מצהירים על פרמטרים אחרים שסופקו על ידי Google רק כדי לשנות את ערכי ברירת המחדל שלהם. פרטים על יצירת מזהים ומפתחות זמינים במאמר בנושא פרמטרים שסופקו על ידי Google.
אפשר גם להגדיר פרמטרים ספציפיים למאגר בקובץ תצורה.
העברת קובץ התצורה למחבר
מגדירים את מאפיין המערכת config כדי להעביר את קובץ התצורה. משתמשים בארגומנט -D
כשמפעילים את המחבר. לדוגמה:
java -classpath myconnector.jar -Dconfig=MyConfig.properties MyConnector
אם לא מציינים את הארגומנט הזה, ערכת ה-SDK מנסה להשתמש בקובץ בשם connector-config.properties בספרייה המקומית.
קביעת אסטרטגיית המעבר
התפקיד העיקרי של מחבר תוכן הוא לסרוק מאגר ולבצע אינדוקס של הנתונים שלו. צריך להטמיע אסטרטגיה על סמך הגודל והפריסה של המאגר. אתם יכולים לעצב אסטרטגיה משלכם או לבחור אסטרטגיה מתוך ה-SDK:
- אסטרטגיית מעבר מלאה
- סורק את כל המאגר ומבצע אינדוקס של כל פריט. האסטרטגיה הזו מתאימה בעיקר למאגרים קטנים שבהם אפשר להרשות לעצמכם את התקורה של סריקה מלאה במהלך כל אינדוקס. מומלץ להשתמש בו למאגרים קטנים עם נתונים סטטיים ברובם, לא היררכיים, או כשקשה לזהות שינויים.
- אסטרטגיה למעבר בין רשימות
- סורק את כל המאגר כדי לקבוע את הסטטוס של כל פריט, ואז יוצר אינדקס רק לפריטים חדשים או מעודכנים. אפשר להשתמש באפשרות הזו לעדכונים מצטברים של אינדקס גדול ולא היררכי, כשזיהוי שינויים לא נתמך.
- מעבר על גרף
- סורק צומת אב כדי לקבוע את הסטטוס של הפריטים שלו, ואז יוצר אינדקס לפריטים חדשים או מעודכנים בצומת הזה. לאחר מכן, המערכת מעבדת באופן רקורסיבי צמתים נמוכים יותר. אפשר להשתמש בזה למאגרי מידע היררכיים שבהם לא מעשי לפרט את כל המזהים, כמו מבני ספריות או אתרים.
ה-SDK מטמיע את האסטרטגיות האלה במחלקות של מחברי תבניות. התבניות האלה יכולות להאיץ את הפיתוח. כדי להשתמש בתבנית, אפשר לעיין בקטע המתאים:
- יצירת מחבר למעבר מלא באמצעות מחלקת תבנית
- יצירת מחבר למעבר על רשימה באמצעות מחלקת תבנית
- יצירת מחבר למעבר בין צמתים בגרף באמצעות מחלקת תבנית
יצירת מחבר מלא למעבר על כל הנתונים באמצעות מחלקת תבנית
הקטע הזה מתייחס לקוד מתוך FullTraversalSample.
הטמעה של נקודת הכניסה למחבר
נקודת הכניסה היא השיטה main(). הוא יוצר מופע של Application ומפעיל את המחבר באמצעות קריאה ל-start().
לפני ששולחים קריאה ל-application.start(), משתמשים במחלקה IndexingApplication.Builder כדי ליצור מופע של התבנית FullTraversalConnector. התבנית הזו מקבלת אובייקט Repository.
ערכת ה-SDK שולחת קריאה ל-initConfig() אחרי ששולחים קריאה ל-method main() שלכם
Application.build(). השיטה initConfig():
- מוודאים שהרכיב
Configurationלא אותחל כבר. - הפונקציה מאתחלת את האובייקט
Configurationעם צמדי מפתח/ערך שסופקו על ידי Google.
הטמעה של ממשק המאגר
האובייקט Repository סורק ומבצע אינדוקס של פריטים במאגר. כשמשתמשים בתבנית, צריך לעקוף רק שיטות מסוימות בממשק Repository. ל-FullTraversalConnector, שינוי מברירת המחדל:
-
init(): להגדרה ולאתחול של מאגר. -
getAllDocs(): כדי לעבור על כל הפריטים ולבצע אינדוקס שלהם. הפונקציה הזו מופעלת פעם אחת לכל מעבר מתוזמן. - (אופציונלי)
getChanges(): אם המאגר תומך בזיהוי שינויים, אפשר לבטל את ההגדרה הזו כדי לאחזר ולאנדקס פריטים ששונו. - (אופציונלי)
close(): לניקוי המאגר במהלך כיבוי.
כל שיטה מחזירה אובייקט ApiOperation שמבצע אינדוקס באמצעות IndexingService.indexItem().
אחזור פרמטרים של הגדרה בהתאמה אישית
כדי לטפל בהגדרות של המחבר, צריך לאחזר את כל הפרמטרים המותאמים אישית מאובייקט Configuration. מבצעים את המשימה הזו בשיטה init() של הכיתה Repository.
המחלקות Configuration כוללות שיטות לאחזור סוגים שונים של נתונים.
כל שיטה מחזירה אובייקט ConfigValue. כדי לאחזר את הערך, משתמשים ב-method get() של האובייקט ConfigValue. בקטע הקוד הבא מתוך FullTraversalSample אפשר לראות איך מאחזרים ערך של מספר שלם בהתאמה אישית:
כדי לאחזר ולנתח פרמטרים עם כמה ערכים, צריך להשתמש באחד ממנתחי הסוגים של המחלקה Configuration. קטע הקוד הזה ממחבר המדריך משתמש ב-getMultiValue כדי לאחזר רשימה של שמות מאגרי GitHub:
ביצוע סריקה מלאה
מחליפים את getAllDocs() כדי לבצע מעבר מלא. השיטה הזו מקבלת נקודת ביקורת כדי לחדש את יצירת האינדקס אם היא מופרעת. לכל פריט:
- מגדירים הרשאות.
- מגדירים מטא-נתונים.
- משלבים אותם ל
RepositoryDoc. - אורזים כל פריט באיטרטור שמוחזר על ידי
getAllDocs().
אם קבוצת הפריטים גדולה מדי בשביל קריאה אחת, צריך להשתמש בנקודת ביקורת ולהתקשר אל hasMore(true).
הגדרת ההרשאות לפריט
מאגרי מידע משתמשים ברשימות של בקרת גישה (ACL) כדי לזהות משתמשים או קבוצות עם גישה לפריט. רשימת ACL כוללת את המזהים של משתמשים או קבוצות מורשים.
כדי לוודא שהמשתמשים יראו רק תוצאות חיפוש שיש להם הרשאה לגשת אליהן, צריך לשכפל את רשימות בקרת הגישה (ACL) של המאגר. כדאי לכלול את רשימת ה-ACL כשמוסיפים פריט לאינדקס, כדי ש-Google Cloud Search יוכל לספק את רמת הגישה הנכונה.
ערכת ה-SDK של Content Connector כוללת מחלקות ושיטות ליצירת מודלים של רשימות בקרת גישה (ACL) ברוב המאגרים. ניתוח של רשימות בקרת הגישה (ACL) במאגר ויצירה של רשימות בקרת גישה תואמות ל-Cloud Search במהלך ההוספה לאינדקס. כדי ליצור מודלים של רשימות ACL מורכבות, כמו אלה שמשתמשות בירושה, צריך לתכנן בקפידה. מידע נוסף זמין במאמר רשימות ACL ב-Cloud Search.
משתמשים במחלקה
Acl.Builder
כדי להגדיר גישה. קטע הקוד הזה מתוך דוגמת המעבר המלא מאפשר לכל המשתמשים בדומיין (getCustomerPrincipal()) לקרוא את כל הפריטים (setReaders()):
כדי ליצור מודל נכון של רשימות ACL במאגר, במיוחד אם משתמשים במודלים של ירושה, צריך את המידע שמופיע במאמר בנושא רשימות ACL ב-Cloud Search.
הגדרת המטא-נתונים של פריט
המטא-נתונים מאוחסנים באובייקט Item. כדי ליצור Item, צריך מזהה ייחודי, סוג פריט, רשימת ACL, כתובת URL וגרסה. משתמשים במחלקה המסייעת
IndexingItemBuilder.
יצירת הפריט שאפשר להוסיף לאינדקס
משתמשים בכיתה
RepositoryDoc.Builder.
RepositoryDoc הוא ApiOperation שמבצע את בקשת IndexingService.indexItem().
משתמשים ב-method setRequestMode() של המחלקה RepositoryDoc.Builder כדי להגדיר את בקשת ההוספה לאינדקס ל-ASYNCHRONOUS או ל-SYNCHRONOUS:
ASYNCHRONOUS- במצב הזה, זמן האחזור בין יצירת האינדקס לבין הצגת התוצאות ארוך יותר, אבל המכסה של קצב העברת הנתונים גדולה יותר. להשתמש במצב אסינכרוני לאינדוקס ראשוני (backfill) של מאגר שלם.
SYNCHRONOUS- במצב הזה זמן האחזור בין יצירת האינדקס לבין הצגת המודעה קצר יותר, אבל מכסת התפוקה קטנה יותר. משתמשים במצב סינכרוני כדי ליצור אינדקס לעדכונים ולשינויים במאגר. אם לא מציינים את מצב הבקשה, ברירת המחדל היא
SYNCHRONOUS.
אורזים כל פריט שאפשר להוסיף לאינדקס באיטרטור
השיטה getAllDocs() מחזירה CheckpointCloseableIterable של אובייקטים מסוג RepositoryDoc. משתמשים בכיתה
CheckpointCloseableIterableImpl.Builder.
השלבים הבאים
- (אופציונלי) אם קצב העברת הנתונים של הוספת האינדקס איטי, אפשר לעיין במאמר בנושא הגדלת קצב הוספת האינדקס.
- (אופציונלי) מטמיעים את
close()כדי לשחרר משאבים. - (אופציונלי) יוצרים מחבר זהויות.
יצירת מחבר למעבר על רשימה באמצעות מחלקת תבנית
תור ההוספה לאינדקס של Cloud Search מכיל מזהים וגיבובים אופציונליים של פריטים במאגר. מחבר של מעבר על רשימה דוחף מזהים לתור הזה ומאחזר אותם לצורך יצירת אינדקס. מערכת Cloud Search מתחזקת את התורים האלה כדי לקבוע את סטטוס הפריטים, כמו מחיקות. מידע נוסף על תור ההוספה לאינדקס של Cloud Search
הקטע הזה מתייחס ל-ListTraversalSample.
הטמעה של נקודת הכניסה למחבר
השיטה main() יוצרת מופע של Application וקוראת ל-start(). משתמשים ב-IndexingApplication.Builder כדי ליצור מופע של התבנית ListingConnector.
הטמעה של ממשק המאגר
מחליפים את השיטות הבאות עבור ListingConnector:
-
init(): להגדרת מאגר. -
getIds(): כדי לאחזר מזהים וגיבובים של כל הרשומות. -
getDoc(): כדי להוסיף, לעדכן או למחוק פריטים מהאינדקס. - (אופציונלי)
getChanges(): לעדכונים מצטברים באמצעות זיהוי שינויים. - (אופציונלי)
close(): לניקוי המאגר.
ביצוע מעבר ברשימה
מחליפים את getIds() כדי לאחזר מזהים וערכי גיבוב. מחליפים את getDoc() כדי לטפל בכל פריט בתור של Cloud Search Indexing.
שליחת מזהי פריטים וערכי גיבוב
מחליפים את getIds() כדי לאחזר מזהים וגיבובים של תוכן. אורזים אותם בבקשה ל-PushItems לתור ההוספה לאינדקס.
משתמשים ב-PushItems.Builder כדי לארוז את המזהים והגיבובים.
מאחזרים ומטפלים בכל פריט
אפשר להגדיר חריגה getDoc() כדי לטפל בפריטים בתור לאינדוקס. הפריטים יכולים להיות חדשים, שעברו שינוי, שלא השתנו או שנמחקו.
- בודקים אם מזהה הפריט קיים במאגר. אם לא, מוחקים אותו.
- שולחים שאילתה לאינדקס כדי לקבל את הסטטוס. אם לא משנים את הערך (
ACCEPTED), לא מתבצעת פעולה. - פריטים חדשים או פריטים ששונו באינדקס: הגדרת הרשאות, הגדרת מטא-נתונים, שילוב ב-
RepositoryDocוהחזרת התוצאה.
טיפול בפריטים שנמחקו
בקטע הקוד הבא אפשר לראות איך בודקים אם פריט קיים ומוחקים אותו אם הוא לא קיים.
טיפול בפריטים שלא השתנו
מבצעים סקר של תור יצירת האינדקס כדי לטפל בפריטים שלא השתנו.
בדוגמה נעשה שימוש בגיבוב כדי לזהות שינויים.
הגדרת ההרשאות לפריט
מאגרי מידע משתמשים ברשימות של בקרת גישה (ACL) כדי לזהות משתמשים או קבוצות עם גישה לפריט. רשימת ACL כוללת את המזהים של משתמשים או קבוצות מורשים.
כדי לוודא שהמשתמשים יראו רק תוצאות חיפוש שיש להם הרשאה לגשת אליהן, צריך לשכפל את רשימות בקרת הגישה (ACL) של המאגר. כדאי לכלול את רשימת ה-ACL כשמוסיפים פריט לאינדקס, כדי ש-Google Cloud Search יוכל לספק את רמת הגישה הנכונה.
ערכת ה-SDK של Content Connector כוללת מחלקות ושיטות ליצירת מודלים של רשימות בקרת גישה (ACL) ברוב המאגרים. ניתוח של רשימות בקרת הגישה (ACL) במאגר ויצירה של רשימות בקרת גישה תואמות ל-Cloud Search במהלך ההוספה לאינדקס. כדי ליצור מודלים של רשימות ACL מורכבות, כמו אלה שמשתמשות בירושה, צריך לתכנן בקפידה. מידע נוסף זמין במאמר רשימות ACL ב-Cloud Search.
משתמשים במחלקה
Acl.Builder
כדי להגדיר גישה. קטע הקוד הזה מתוך דוגמת המעבר המלא מאפשר לכל המשתמשים בדומיין (getCustomerPrincipal()) לקרוא את כל הפריטים (setReaders()):
כדי ליצור מודל נכון של רשימות ACL במאגר, במיוחד אם משתמשים במודלים של ירושה, צריך את המידע שמופיע במאמר בנושא רשימות ACL ב-Cloud Search.
הגדרת המטא-נתונים של פריט
יצירת פריט שניתן להוסיף לאינדקס
משתמשים ב-method setRequestMode() של המחלקה RepositoryDoc.Builder כדי להגדיר את בקשת ההוספה לאינדקס ל-ASYNCHRONOUS או ל-SYNCHRONOUS:
ASYNCHRONOUS- במצב הזה, זמן האחזור בין יצירת האינדקס לבין הצגת התוצאות ארוך יותר, אבל המכסה של קצב העברת הנתונים גדולה יותר. להשתמש במצב אסינכרוני לאינדוקס ראשוני (backfill) של מאגר שלם.
SYNCHRONOUS- במצב הזה זמן האחזור בין יצירת האינדקס לבין הצגת המודעה קצר יותר, אבל מכסת התפוקה קטנה יותר. משתמשים במצב סינכרוני כדי ליצור אינדקס לעדכונים ולשינויים במאגר. אם לא מציינים את מצב הבקשה, ברירת המחדל היא
SYNCHRONOUS.
השלבים הבאים
הנה כמה פעולות אפשריות:
- (אופציונלי) מטמיעים את השיטה
close()כדי לשחרר משאבים לפני כיבוי. - (אופציונלי) יוצרים מחבר זהויות באמצעות Content Connector SDK.
יצירת מחבר למעבר בין צמתים בגרף באמצעות מחלקת תבנית
תור ההמתנה להוספה לאינדקס ב-Cloud Search מכיל מזהים וערכי hash אופציונליים לכל פריט במאגר. מחבר של מעבר גרף דוחף מזהי פריטים לתור ההוספה לאינדקס של Google Cloud Search, ומאחזר אותם אחד בכל פעם לצורך הוספה לאינדקס. מערכת Google Cloud Search מתחזקת תורים ומשווה את התוכן שלהם כדי לקבוע את סטטוס הפריטים, למשל אם פריט נמחק מהמאגר. מידע נוסף על תור ההוספה לאינדקס של Cloud Search זמין במאמר תור ההוספה לאינדקס של Google Cloud Search.
במהלך יצירת האינדקס, התוכן של הפריט מאוחזר ממאגר הנתונים, וכל מזהי פריטי הצאצא נדחפים לתור. המחבר מעבד באופן רקורסיבי מזהים של הורה וצאצא עד שכל הפריטים מטופלים.
הטמעה של נקודת הכניסה של המחבר
נקודת הכניסה למחבר היא השיטה main(). ה-method הזו יוצרת מופע של המחלקה Application ומפעילה את ה-method start() שלה כדי להריץ את המחבר.
לפני שקוראים ל-application.start(), משתמשים במחלקה IndexingApplication.Builder כדי ליצור מופע של התבנית ListingConnector. הפונקציה
ListingConnector
מקבלת אובייקט
Repository
שמיישמים את השיטות שלו.
הטמעה של ממשק המאגר
אפשר לשנות את init(), getIds(), getDoc(), ואם רוצים גם את getChanges() או close().
ביצוע מעבר בין צמתים בגרף
מחליפים את getIds() כדי לאחזר מזהים ראשוניים ואת getDoc() כדי לטפל בפריטים ולהעביר מזהים של ילדים לתור.
שליחת מזהי פריטים וערכי גיבוב
מאחזרים ומטפלים בכל פריט
- בודקים אם המזהה קיים במאגר. אם לא, צריך למחוק את הפריט.
- לפריטים קיימים, מגדירים הרשאות ומטא-נתונים ומשלבים אותם ב-
RepositoryDoc. - שליחת מזהי צאצא לתור של יצירת האינדקס.
- החזרת
RepositoryDoc.
טיפול בפריטים שנמחקו
הגדרת מטא-נתונים ויצירת הפריט
הוספת מזהי צאצא לתור של יצירת האינדקס
יצירת מחבר תוכן באמצעות API בארכיטקטורת REST
בקטעים הבאים מוסבר איך ליצור מחבר תוכן באמצעות API בארכיטקטורת REST.
קביעת אסטרטגיית המעבר
השיטות (Full, List ו-Graph) זהות מבחינה רעיונית לשיטות ב-SDK. מטמיעים את האסטרטגיה שבחרתם באמצעות API בארכיטקטורת REST.
הטמעה של אסטרטגיית המעבר ופריטים לאינדקס
רושמים את הסכימה, ואז מאכלסים את האינדקס באמצעות:
- (אופציונלי)
items.uploadלקבצים גדולים מ-100KiB. - (אופציונלי)
media.uploadלקובצי מדיה. items.indexכדי להוסיף את הפריט לאינדקס.דוגמה לבקשה להוספה לאינדקס:
{ "name": "datasource/<data_source_id>/items/titanic", "acl": { "readers": [ { "gsuitePrincipal": { "gsuiteDomain": true } } ] }, "metadata": { "title": "Titanic", "viewUrl": "http://www.imdb.com/title/tt2234155/", "objectType": "movie" }, "structuredData": { "object": { "properties": [ { "name": "movieTitle", "textValues": { "values": ["Titanic"] } } ] } }, "content": { "inlineContent": "A seventeen-year-old aristocrat falls in love...", "contentFormat": "TEXT" }, "version": "01", "itemType": "CONTENT_ITEM" }(אופציונלי) משתמשים ב
items.getכדי לאמת את ההוספה לאינדקס.
טיפול בשינויים במאגר
כדי לבצע אינדוקס מלא, צריך ליצור מחדש את האינדקס של כל המאגר באופן תקופתי. כדי לעבור בין רשימות או גרפים, משתמשים בתור האינדוקס של Google Cloud כדי לעקוב אחרי שינויים ולאנדקס רק את מה שהשתנה. משתמשים ב-items.push כדי להוסיף פריטים לתור.