גישה לנתוני OpenSearch מ-AlloyDB Omni

בוחרים גרסת תיעוד:

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

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

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

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

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

מוודאים שלחשבון השירות שבו משתמש AlloyDB Omni יש את ההרשאה secretmanager.secretAccessor לקריאת הסוד מ-Secret Manager. מידע נוסף על ניהול הגישה לסודות

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

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

  1. מתחברים למסד הנתונים ומפעילים את התוסף:

    CREATE EXTENSION external_search_fdw;
    
  2. יוצרים שרת חיצוני:

    CREATE SERVER OPENSEARCH_SERVER_NAME
    FOREIGN DATA WRAPPER external_search_fdw
    OPTIONS (
      server 'OPENSEARCH_SERVER_HOST_PORT',
      search_provider 'opensearch',
      auth_mode 'secret_manager',
      auth_method 'AUTH_METHOD',
      secret_path 'SECRET_PATH'
    );
    

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

    • ‫OPENSEARCH_SERVER_NAME: השם של שרת הנתונים החיצוני. לדוגמה, opensearch.

    • ‫OPENSEARCH_SERVER_HOST_PORT: כתובת ה-URL שגלויה לכולם של אשכול OpenSearch. לדוגמה, https://search-my-domain.us-east-1.es.amazonaws.com:443.

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

    • ‫SECRET_PATH: הנתיב ב-Secret Manager לפרטי הכניסה לאימות ב-OpenSearch. לדוגמה, projects/PROJECT_ID/secrets/opensearch-credentials/versions/1.

  3. מגדירים את מיפוי המשתמשים לשרת OpenSearch:

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. ממפים את הסכימה של אינדקס OpenSearch לטבלה חיצונית של PostgreSQL:

    CREATE FOREIGN TABLE OPENSEARCH_FD_TABLE(
        metadata external_search_fdw_schema.OpaqueMetadata,
        OPENSEARCH_FIELDS)
           SERVER OPENSEARCH_SERVER_NAME
           OPTIONS(
                remote_table_name 'OPENSEARCH_INDEX_NAME'
           );
    

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

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

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

    • ‫OPENSEARCH_INDEX_NAME: השם של אינדקס OpenSearch. לדוגמה, my-opensearch-index.

שליחת שאילתות לנתונים ב-OpenSearch

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

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

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

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

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

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

  • ‫FILTER: (אופציונלי) מסנן שאפשר להחיל על שאילתת OpenSearch. לדוגמה, a = 10 AND b < 105.

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

Query DSL

לתרחישים מתקדמים לדוגמה, אפשר להשתמש ב-Query Domain Specific Language‏ (DSL) בסגנון JSON של OpenSearch.

SELECT id, title
FROM OPENSEARCH_FD_TABLE
ORDER BY metadata <@> $${
  "query": {
    "bool": {
      "must": { "match": { "title": "opensearch" } },
      "filter": { "term": { "category": "software" } }
    }
  },
  "sort": [
    { "price": { "order": "desc" } }
  ]
}$$
LIMIT 1;

מחליפים את OPENSEARCH_FD_TABLE בשם של טבלת הנתונים החיצונית שמייצגת את טבלת OpenSearch. לדוגמה, my-fd-opensearch-table.

כדי לבצע חיפוש היברידי בנתוני OpenSearch, צריך לשלב את תוצאות החיפוש של טוקנים ב-OpenSearch עם תוצאות החיפוש הווקטורי ב-AlloyDB Omni.

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

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

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

  • ‫WEIGHT: התרומה של רשומת החיפוש הזו ל-Reciprocal Rank Fusion‏ (RRF) הכולל. לדוגמה, 0.5. אם לא תציינו משקלים, הם יחולקו באופן שווה. מידע נוסף זמין במאמר פרמטרים של פונקציות חיפוש משולב.

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

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

פתרון בעיות

אם נתקלתם בבעיות באימות או בקישוריות כששלחתם שאילתה לאשכול OpenSearch, כדאי לבדוק את הדברים הבאים:

  • שגיאות אימות מסוג HTTP 401 או 403: מוודאים שהסוד של OpenSearch ב-Secret Manager מכיל מחרוזת בפורמט username:password, ושלחשבון השירות יש את ההרשאה secretmanager.secretAccessor.

  • זמן קצוב לתפוגה של החיבור: בודקים את כללי הרשת ואת ההגדרות של חומת האש בין AlloyDB Omni לבין נקודת הקצה של OpenSearch.

מגבלות

  • לקריאה בלבד: AlloyDB Omni קורא נתונים מ-OpenSearch, אבל לא כותב אליו.

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

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

  • סוגים לא נתמכים: סוגים מיוחדים של OpenSearch, כמו סוגים גיאו-מרחביים, לא נתמכים.

  • אימות: צריך להשתמש באימות בסיסי (שם משתמש וסיסמה) שמוגדר באשכול OpenSearch.

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