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

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

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

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

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

מערכת AlloyDB שומרת את פרטי הכניסה של OpenSearch וקוראת אותם מ-Secret Manager. מידע נוסף על השימוש ב-Secret Manager זמין במאמר יצירה וגישה לסוד באמצעות Secret Manager.

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

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

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

  1. מפעילים את התוסף external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. יוצרים שרת עבור אשכול OpenSearch.

    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 'Basic',
      secret_path 'SECRET_PATH'
    );
    

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

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

    • OPENSEARCH_SERVER_HOST_PORT: כתובת URL (נקודת קצה) שפונה לציבור של אשכול OpenSearch.

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

  3. מגדירים את מיפוי המשתמשים ב-PostgreSQL לשרת OpenSearch. שימו לב: כדי להשתמש ב-FDW של PostgreSQL, צריך למפות את המשתמשים. ב-AlloyDB, האימות מתבצע באמצעות כותרת ההרשאה של REST.

    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.

סוגי נתונים נתמכים

‫AlloyDB תומך בסוגי הנתונים הבאים של OpenSearch:

סוגי נתונים סוג AlloyDB
alias סוג PostgreSQL של השדה שalias מפנה אליו
binary bytea
boolean BOOLEAN

byte,

short

SMALLINT
date TIMESTAMPTZ

double,

scaled_float

DOUBLE PRECISION

float,

half_float

REAL
integer INTEGER
long BIGINT

object,

flattened

jsonb

text,

keyword,

constant_keyword,

wildcard

TEXT
unsigned_long NUMERIC

שליחת שאילתות לנתוני OpenSearch

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

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

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

שאילתות 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

לתרחישי שימוש מתקדמים, אפשר להשתמש ב-OpenSearch JSON-style Query DSL.

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.

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. לדוגמה, "opensearch_field_name:\"cloud databases\"" מחפש את הביטוי 'cloud databases' בשדה opensearch_field_name.

דוגמאות ל-pushdown

כדי לשפר את היעילות של השאילתות, AlloyDB מנסה להעביר את ההיבטים הבאים של השאילתה ישירות לקריאה ל-API שמתבצעת אל OpenSearch:

  • SELECT שדות
  • מסננים של WHERE
  • ORDER BY מיון
  • LIMIT

בטבלה הבאה מופיעות דוגמאות לשאילתות שממחישות אילו היבטים של AlloyDB אפשר להעביר למטה ואילו לא.

סוג השאילתה דוגמה לשאילתה העברת רכיבי שאילתה למטה
שאילתות ללא סינון
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT שדות
  • ORDER BY ... DESC מיון
  • LIMIT
התאמה מדויקת לטקסט
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT שדות
  • מסנן WHERE
  • LIMIT
ביטויים של שדה יחיד
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT שדות
  • מסנן WHERE
ביטויים קבועים
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT שדות
  • מסנן WHERE
  • LIMIT
ביטויים עם פונקציות
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT שדות
ביטויים עם כמה שדות
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT שדות
סינון לפי ציון
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT שדות
  • ORDER BY ... DESC מיון
LIKE ואופרטורים דומים
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT שדות
  • מסנן WHERE id > 10
שאילתות גולמיות
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT שדות
  • ORDER BY ... DESC מיון

פתרון בעיות

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

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

מגבלות

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

  • שילוב OpenSearch זמין רק בגרסה ראשית של PostgreSQL‏ 17ומעלה.

  • ‫AlloyDB קורא נתונים של OpenSearch, אבל לא כותב אותם.

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

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

  • אין תמיכה בסוגים מיוחדים של OpenSearch, כמו geo_point רשימה מלאה של סוגי הנתונים הנתמכים זמינה במאמר סוגי נתונים נתמכים.

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

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