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

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

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

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

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

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

מוודאים שלחשבון השירות של AlloyDB יש את התפקיד "גישה לסודות ב-Secret Manager" (roles/secretmanager.secretAccessor) כדי לקרוא את הסוד מ-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 לשאילתות API בארכיטקטורת REST של OpenSearch.

כדי לשלוח שאילתות לנתונים ב-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

לתרחישי שימוש מתקדמים, משתמשים ב-Query 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.

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"‏ (roles/secretmanager.secretAccessor).
  • זמן קצוב לתפוגה של החיבור: ודאו שהקישוריות לכתובת IP ציבורית יוצאת מופעלת במכונה הראשית של AlloyDB, ושחומת האש של OpenSearch מאפשרת חיבורים נכנסים ביציאה שצוינה.

מגבלות

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

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

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

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

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

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

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

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