גישה לנתוני Solr מ-AlloyDB ל-PostgreSQL

אתם יכולים לגשת לנתונים שמאוחסנים ב-Apache Solr ולחפש בהם באמצעות שילוב החיפוש החיצוני ב-AlloyDB ל-PostgreSQL.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

אחסון פרטי הכניסה של Solr ב-Secret Manager

‫AlloyDB שומר וקורא את פרטי הכניסה שלכם ל-Solr מ-Secret Manager. באימות בסיסי, הערך של הסוד ב-Secret Manager חייב להיות מחרוזת בקידוד Base64 בפורמט username:password. למידע נוסף על השימוש ב-Secret Manager, קראו את המאמר יצירה וגישה לסוד באמצעות Secret Manager.

מוודאים שלחשבון השירות של AlloyDB יש את התפקיד "גישה לסודות ב-Secret Manager" (roles/secretmanager.secretAccessor) כדי לקרוא את הסוד מ-Secret Manager. מידע נוסף זמין במאמר יצירה וגישה לסוד באמצעות Secret Manager.

הפעלה והגדרה של התוסף external_search_fdw

כדי להתחיל את השילוב עם Solr, צריך להגדיר גישה לאשכול Solr דרך שרת נתונים חיצוני.

CREATE EXTENSION external_search_fdw;

CREATE SERVER SOLR_SERVER_NAME
FOREIGN DATA WRAPPER external_search_fdw
OPTIONS (
  server 'SOLR_SERVER_HOST_PORT',
  search_provider 'solr',
  auth_mode 'secret_manager',
  auth_method 'AUTH_METHOD',
  secret_path 'SECRET_PATH'
);

מחליפים את המשתנים הבאים:

  • ‫SOLR_SERVER_NAME: השם של שרת הנתונים החיצוני. לדוגמה: solr.

  • ‫SOLR_SERVER_HOST_PORT: כתובת ה-URL שגלויה לכולם של אשכול ה-SOLR. לדוגמה: https://node1.solr.test.com:8983.

  • ‫AUTH_METHOD: סוג האימות שבו משתמשים. לדוגמה, Basic.

  • ‫SECRET_PATH: הנתיב ב-Secret Manager לפרטי הכניסה לאימות ב-Solr. לדוגמה, projects/123456789012/secrets/apikey/versions/1. ‫123456789012 מייצג את מזהה הפרויקט ב- Google Cloud .

  1. מגדירים את מיפוי המשתמשים של PostgreSQL לשרת Solr. שימו לב ש-FDW של PostgreSQL דורשים את מיפוי המשתמשים הזה כדי לפעול. ‫AlloyDB מבצע אימות באמצעות כותרת ההרשאה של REST.

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER SOLR_SERVER_NAME;
    
  2. ממפים את הסכימה של אוסף Solr לטבלה חיצונית של PostgreSQL.

    CREATE FOREIGN TABLE SOLR_FD_TABLE(
        metadata external_search_fdw_schema.OpaqueMetadata,
        SOLR_FIELDS)
           SERVER SOLR_SERVER_NAME
           OPTIONS(
                remote_table_name 'SOLR_COLLECTION_NAME'
                unique_key_sort_suffix 'UNIQUE_KEY_SORT_SUFFIX'
           );
    

    מחליפים את המשתנים החדשים הבאים:

    • ‫SOLR_FD_TABLE: שם טבלת הנתונים החיצונית שמייצגת את טבלת Solr. לדוגמה, my-fd-solr-table.

    • ‫SOLR_FIELDS: רשימה מופרדת בפסיקים שבה כל רשומה היא בפורמט solr_field_name PG_DATA_TYPE. במאמר סוגי נתונים נתמכים תוכלו למצוא רשימה של סוגי הנתונים הנתמכים ב-Solr וסוגי הנתונים התואמים ב-PostgreSQL.

    • ‫UNIQUE_KEY_SORT_SUFFIX: (אופציונלי) שדה המפתח הייחודי ב-Solr, או רשימה מופרדת בפסיקים של כמה שדות עם סדר המיון שלהם, לדוגמה, myid0 ASC, myid1 DESC, שמשמשת להוספת מספרי דפים. ברירת המחדל היא id.

    • ‫PG_DATA_TYPE: הסוג ב-PostgreSQL שאליו רוצים למפות את הסוג ב-Spanner. דוגמאות נפוצות:

      • TEXT לנתוני מחרוזת.
      • INTEGER לנתונים מספריים.
    • ‫SOLR_COLLECTION_NAME: השם של אוסף Solr. לדוגמה, my-solr-collection.

שליחת שאילתות לגבי נתוני Solr

‫AlloyDB מקבל שאילתות SQL וממיר אותן לשאילתות Solr API בארכיטקטורת REST.

כדי לשלוח שאילתה לנתוני Solr, יש לכם את האפשרויות הבאות:

  • שאילתות SQL סטנדרטיות
  • Query DSL
  • חיפושים משולבים

שאילתות SQL סטנדרטיות

אפשר להשתמש ב-SQL סטנדרטי עם תחביר Lucene לביטוי החיפוש.

SELECT id, body
FROM SOLR_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';

מחליפים את המשתנים הבאים:

  • ‫SOLR_FD_TABLE: שם טבלת הנתונים החיצונית שמייצגת את טבלת Solr. לדוגמה, my-fd-solr-table.

  • ‫FILTER (אופציונלי): מסנן להחלה על שאילתת Solr. לדוגמה, AND qubits < 105.

  • ‫QUERY: שאילתה לשליחה אל Solr. לדוגמה, body:database.

Query DSL

לתרחישים מתקדמים לדוגמה, אפשר להשתמש ב-Query DSL בסגנון Solr JSON.

SELECT id, title
FROM SOLR_FD_TABLE
ORDER BY metadata <@> $${
  "query": "title:solr",
  "filter": ["category:software", "inStock:true"],
  "sort": "price desc"
}$$
LIMIT 1;

מחליפים את SOLR_FD_TABLE בשם של טבלת הנתונים החיצונית שמייצגת את טבלת Solr. לדוגמה, my-fd-solr-table.

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

SELECT *
FROM ai.hybrid_search(
  ARRAY[
    '{"limit": LIMIT,
      "weight": WEIGHT,
      "table_name": "SOLR_FD_TABLE",
      "key_column": "id",
      "query_text_input": "QUERY"}'::jsonb
  ])
ORDER BY score DESC;

מחליפים את המשתנים הבאים:

  • ‫LIMIT: מספר התוצאות שיוחזרו. לדוגמה, 10.

  • ‫WEIGHT: התרומה של רשומת החיפוש הזו ל-Reciprocal Rank Fusion‏ (RRF) הכולל. לדוגמה, 0.5.

  • ‫SOLR_FD_TABLE: שם טבלת הנתונים החיצונית שמייצגת את טבלת Solr. לדוגמה, my-fd-solr-table.

  • ‫QUERY: שאילתה לשליחה אל Solr. לדוגמה, השאילתה "solr_field_name:\"cloud databases\"" מחפשת את הביטוי "cloud databases" בשדה solr_field_name.

פתרון בעיות

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

  • שגיאות אימות HTTP 401 או 403: מוודאים שהסוד של Solr ב-Secret Manager מכיל מחרוזת בקידוד base64 בפורמט username:password, ושלחשבון השירות שמשמש את AlloyDB יש את ההרשאה secretmanager.secretAccessor.
  • זמן קצוב לתפוגה של החיבור: מוודאים שהקישוריות לכתובת IP ציבורית יוצאת מופעלת במכונה הראשית של AlloyDB, ושהחומת האש של Solr מאפשרת חיבורים נכנסים ביציאה שצוינה.

מגבלות

לפני שמקשרים את AlloyDB ל-Solr, חשוב לשים לב למגבלות הבאות:

  • השילוב של Solr זמין רק בגרסה הראשית 17 של PostgreSQL ואילך.

  • ‫AlloyDB קורא נתונים מ-Solr, אבל לא כותב אליו.

  • ‫AlloyDB לא מוסיף באופן אוטומטי את נתוני מסד הנתונים שלכם לאינדקס ב-Solr. אתם אחראים לאכלס את האוספים של Solr ולשמור על עקביות בין הנתונים ב-AlloyDB לבין הנתונים שנוספו לאינדקס ב-Solr.

  • ‫AlloyDB לא מסנכרן סכימות באופן אוטומטי עם Solr. אם הסכימה של אוסף Solr משתנה, צריך לעדכן באופן ידני את הסכימה של הטבלה החיצונית התואמת ב-PostgreSQL.

  • בניגוד ל-Elasticsearch, ב-Solr אין שדות מוגדרים מראש מסוג JSON. צריך למפות את השדות מסוג JSON למחרוזות בפורמט TEXT או jsonb.

  • כדי שהעימוד יעבוד כמו שצריך, ב-Solr נדרש מפתח ייחודי בביטוי המיון. כברירת מחדל, המערכת משתמשת בשדה id. אתם יכולים לציין שדה בהתאמה אישית, או רשימה מופרדת בפסיקים של כמה שדות יחד עם סדרי המיון הנפרדים שלהם, לדוגמה, myid0 ASC, myid1 DESC, באמצעות האפשרות unique_key_sort_suffix כשאתם יוצרים את הטבלה החיצונית.

המאמרים הבאים