כדי לגשת לנתונים שמאוחסנים ב-Elasticsearch ולחפש אותם, אפשר ליצור עטיפת נתונים חיצוניים (FDW) וטבלה חיצונית ב-AlloyDB ל-PostgreSQL.
מגבלות
לפני שמחברים את AlloyDB ל-Elasticsearch, חשוב להביא בחשבון את המגבלות הבאות:
השילוב של Elasticsearch זמין רק בגרסה הראשית של PostgreSQL
17ומעלה.AlloyDB קורא נתונים של Elasticsearch, אבל לא כותב אליהם.
אתם אחראים לסנכרון הנתונים בין AlloyDB לבין Elasticsearch.
אין תמיכה בסוגים מיוחדים של Elasticsearch, כמו
geo_point. רשימה מלאה של סוגי הנתונים הנתמכים זמינה במאמר סוגי נתונים נתמכים.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
מפעילים קישוריות יוצאת במכונה הראשית של AlloyDB.
יוצרים מפתח API אישי/משתמש לקריאה בלבד, ש-AlloyDB יכול להשתמש בו כדי לגשת לאשכול Elasticsearch.
אחסון מפתח Elasticsearch API ב-Secret Manager
AlloyDB מאחסן את מפתח ה-API של Elasticsearch וקורא אותו מ-Secret Manager. מידע נוסף על השימוש ב-Secret Manager זמין במאמר יצירה וגישה לסוד באמצעות Secret Manager.
חשוב לוודא שנתתם לחשבון השירות של AlloyDB הרשאה לקרוא את הסוד. מידע נוסף מופיע במאמר בנושא יצירה של סוד וגישה אליו באמצעות Secret Manager.
הפעלה והגדרה של התוסף external_search_fdw
כדי להתחיל את השילוב עם Elasticsearch, צריך לפעול לפי ההוראות הבאות כדי להפעיל ולהגדיר את התוסף external_search_fdw AlloyDB:
מפעילים את התוסף
external_search_fdw.CREATE EXTENSION external_search_fdw;הגדרת גישה לאשכול Elasticsearch דרך שרת נתונים חיצוני.
CREATE SERVER ELASTICSEARCH_SERVER_NAME FOREIGN DATA WRAPPER external_search_fdw OPTIONS (server 'ELASTICSEARCH_SERVER_HOST_PORT', search_provider 'elastic', auth_mode 'secret_manager', auth_method 'AUTH_METHOD', secret_path 'SECRET_PATH', max_deadline_ms 'MAX_DEADLINE', pagination_num_results 'PAGINATION_NUM_RESULTS', pagination_context_timeout_ms 'PAGINATION_CONTEXT_TIMEOUT');מחליפים את המשתנים הבאים:
ELASTICSEARCH_SERVER_NAME: השם של שרת הנתונים החיצוני. לדוגמה,my-elasticsearch-server.
ELASTICSEARCH_SERVER_HOST_PORT: כתובת URL שפונה לציבור של אשכול Elasticsearch. לדוגמה,https://node1.elastic.test.com:9200.
AUTH_METHOD: סוג האימות שבו רוצים להשתמש. אפשר לבחור מבין האפשרויות הבאות:
ApiKey: Elasticsearch מפתח API אישי/של משתמש.
Basic: שם המשתמש והסיסמה של Elasticsearch.
SECRET_PATH: הנתיב ב-Secret Manager לפרטי האימות של Elasticsearch. לדוגמה,projects/123456789012/secrets/apikey/versions/1. 123456789012מייצג את מזהה הפרויקט ב- Google Cloud .(אופציונלי)
MAX_DEADLINE: משך הזמן המקסימלי, באלפיות השנייה, שבו AlloyDB ממתין לתגובה מ-Elasticsearch. צריך להגדיר את הערך הזה על סמך המיקומים של מופעי AlloyDB ו-Elasticsearch. ערך ברירת המחדל הוא10000.(אופציונלי)
PAGINATION_NUM_RESULTS: מספר התוצאות המקסימלי שאפשר לאחזר לכל אצווה מ-Elasticsearch. אם מבקשים יותר תוצאות, AlloyDB מאחזר את התוצאות בכמה אצוות בגודל הזה. ערך ברירת המחדל הוא32.(אופציונלי)
PAGINATION_CONTEXT_TIMEOUT: משך הזמן באלפיות השנייה שבו Elasticsearch שומר על ההקשר של בקשת החלוקה לדפים פעיל. ערך ברירת המחדל הוא30000.
מגדירים את מיפוי המשתמש של PostgreSQL לשרת Elasticsearch. שימו לב: כדי להשתמש ב-FDW של PostgreSQL, צריך למפות את המשתמשים. ב-AlloyDB, האימות מתבצע באמצעות כותרת ההרשאה של REST.
CREATE USER MAPPING FOR CURRENT_USER SERVER ELASTICSEARCH_SERVER_NAME;מגדירים את הסכמה של נתוני Elasticsearch באמצעות טבלת נתונים חיצונית.
CREATE FOREIGN TABLE ELASTICSEARCH_FD_TABLE( metadata external_search_fdw_schema.OpaqueMetadata, ELASTICSEARCH_FIELDS) SERVER ELASTICSEARCH_SERVER_NAME OPTIONS(remote_table_name 'ELASTICSEARCH_INDEX_NAME');מחליפים את המשתנים החדשים הבאים:
ELASTICSEARCH_FD_TABLE: השם של טבלת הנתונים החיצונית שמייצגת את טבלת Elasticsearch. לדוגמה,my-fd-elasticsearch-table.
ELASTICSEARCH_FIELDS: רשימה מופרדת בפסיקים של הגדרות סכימת שדות של Elasticsearch בפורמט הבא:elasticsearch_field_name PG_DATA_TYPE. לדוגמה:elasticsearch_boolean_field_name BOOLEAN, elasticsearch_double_field_name DOUBLE PRECISION. השדות האלה צריכים להיות זהים לשמות השדות ב-Elasticsearch, אלא אם מוסיפים את האפשרותremote_field_name. לדוגמה,elasticsearch_foo OPTIONS (remote_field_name 'elasticsearch_FOO').רשימה של סוגי הנתונים של Elasticsearch שאפשר להגדיר ב-AlloyDB זמינה במאמר בנושא סוגי נתונים נתמכים.
ELASTICSEARCH_INDEX_NAME: השם של אינדקס Elasticsearch. לדוגמה,my-elasticsearch-index.
סוגי נתונים נתמכים
AlloyDB תומך בסוגי הנתונים הבאים של Elasticsearch:
| סוגי נתונים | סוג PostgreSQL |
|---|---|
alias
|
סוג PostgreSQL של השדה שalias מפנה אליו
|
binary
|
bytea
|
boolean
|
BOOLEAN
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
שאילתות על נתונים ב-Elasticsearch
AlloyDB מקבל שאילתות SQL וממיר אותן לשאילתות של Elasticsearch REST API. במהלך ההמרה, מערכת AlloyDB מנסה להעביר כמה שיותר לוגיקת שאילתות בלי לשנות את הזהות של השאילתה, כולל LIMIT של שאילתת ה-SQL. עם זאת, יש מקרים שבהם כדאי לציין שלא להעביר שדות מסוימים של Elasticsearch, או מקרים שבהם אי אפשר להעביר לוגיקת שאילתות. לדוגמה, אי אפשר להעביר את LIKE ואופרטורים אחרים של התאמת טקסט. דוגמאות נוספות למה שאפשר ומה שאי אפשר להעביר מפורטות במאמר דוגמאות להעברה.
בתרחישים שבהם הערך של LIMIT גבוה מהערך של pagination_num_results או שבהם הערך של LIMIT לא צוין או שלא ניתן להקטין אותו, AlloyDB משתמש ב-Scroll API, שיכול להיות עתיר משאבים.
ממשק Scroll API יכול לצרוך הרבה משאבים, ולכן מומלץ לבדוק את השאילתות באמצעות EXPLAIN VERBOSE כדי לראות באילו ממשקי API נעשה שימוש. הגבלת השימוש ב-Scroll API ושימוש ב-LIMIT משפרים את הביצועים.
כדי להריץ שאילתות על נתוני Elasticsearch, יש לכם את האפשרויות הבאות:
- שאילתות SQL סטנדרטיות
- Query DSL
- חיפושים היברידיים
שאילתות SQL סטנדרטיות
אפשר לכתוב שאילתות SQL סטנדרטיות באמצעות התחביר של Lucene ב-Elasticsearch.
כדי להריץ שאילתת SQL סטנדרטית, אפשר להשתמש בשאילתה לדוגמה הבאה:
SELECT id, body
FROM ELASTICSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';
מחליפים את המשתנים הבאים:
ELASTICSEARCH_FD_TABLE: השם של טבלת הנתונים החיצונית שמייצגת את טבלת Elasticsearch. לדוגמה,my-fd-elasticsearch-table.(אופציונלי)
FILTER: מסנן שמוחל על שאילתת Elasticsearch. לדוגמה,AND qubits < 105.
QUERY: שאילתה לשליחה אל Elasticsearch. הנה כמה דוגמאות לשאילתות:body:quantum body:computingbody:(quantum computing)body:(quantum AND computing)body:"quantum computing"body:"quantum computing" AND qubits:[* TO 105}
Query DSL
Query DSL היא שפת שאילתות מלאה בסגנון JSON של Elasticsearch, שמומלצת לתרחישי שימוש מתקדמים. בעזרת Query DSL אפשר לבצע חיפושים מורכבים, סינון וצבירות שלא ניתן לבטא בתחביר של שאילתות SQL.
כדי להריץ שאילתות באמצעות Query DSL, אפשר להיעזר בשאילתה לדוגמה הבאה:
SELECT id, body
FROM ELASTICSEARCH_FD_TABLE
ORDER BY
metadata <@> $${
"query": {
"bool": {
"must": [
{
"query_string": {
"query" : "QUERY"
}
}
],
"filter": [
{
"range": {
"id": {
"lt": "10"
}
}
}
]
}
},
"sort": [
{
"id": {
"order": "desc"
}
}
]
}$$
LIMIT 1;
מחליפים את המשתנים הבאים:
ELASTICSEARCH_FD_TABLE: השם של טבלת הנתונים החיצונית שמייצגת את טבלת Elasticsearch. לדוגמה,my-fd-elasticsearch-table.
QUERY: שאילתה לשליחה אל Elasticsearch. לדוגמה,"elasticsearch_field_name:\"quantum computing\" OR int_field:[* TO 3]".
שימו לב: ב-Query DSL, אתם צריכים להעביר רק את הביטויים query, filter ו-sort.
חיפושים היברידיים
כדי לבצע חיפוש היברידי בנתוני Elasticsearch, אפשר להיעזר בדוגמה הבאה לחיפוש:
SELECT *
FROM
ai.hybrid_search(
ARRAY[
'{"limit": LIMIT,
"data_type": "external_search_fdw",
"weight": WEIGHT,
"table_name": "ELASTICSEARCH_FD_TABLE",
"key_column": "DOCUMENT_ID_COLUMN_NAME",
"query_text_input": QUERY}'::jsonb],
NULL::TEXT,
'RRF',
FALSE)
ORDER BY score DESC;
מחליפים את המשתנים הבאים:
LIMIT: מספר התוצאות שיוחזרו. לדוגמה,3.
WEIGHT: התרומה של רשומת החיפוש הזו למיזוג הכולל של דירוג הדדי (RRF).
ELASTICSEARCH_FD_TABLE: השם של טבלת הנתונים החיצונית שמייצגת את טבלת Elasticsearch. לדוגמה,my-fd-elasticsearch-table.DOCUMENT_ID_COLUMN_NAME: שם העמודה של מזהה המסמך.
QUERY: שאילתה לשליחה אל Elasticsearch. לדוגמה, החיפוש"elasticsearch_field_name:\"quantum computing\""יחפש את הביטוי 'quantum computing' בשדהelasticsearch_field_name. אפשר להשתמש בשאילתה בכל סוגי השאילתות שמפורטים בסוגי הנתונים הנתמכים.
מידע נוסף על הפרמטרים שזמינים לחיפושים היברידיים זמין במאמר פרמטרים של פונקציות חיפוש היברידיות.
דוגמאות ל-pushdown
כדי שהשאילתות יהיו יעילות יותר, AlloyDB מנסה להעביר את ההיבטים הבאים של השאילתה ישירות לקריאה ל-API שמתבצעת אל Elasticsearch:
SELECTשדותWHEREמסנניםORDER BYמיוןLIMIT
בטבלה הבאה מוצגות שאילתות לדוגמה שממחישות אילו היבטים של AlloyDB אפשר להעביר למטה ואילו לא.
| סוג השאילתה | דוגמה לשאילתה | העברת רכיבי שאילתה למטה |
|---|---|---|
| שאילתות ללא סינון |
SELECT id, body FROM elasticsearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| התאמה מדויקת לטקסט |
SELECT id, body FROM elasticsearch_table WHERE body = 'foo' LIMIT 10; |
|
| ביטויים של שדה יחיד |
SELECT id, body FROM elasticsearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| ביטויים קבועים |
SELECT id, body FROM elasticsearch_table WHERE id > (1+1) LIMIT 10; |
|
| ביטויים עם פונקציות |
SELECT id, body FROM elasticsearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| ביטויים עם כמה שדות |
SELECT id, body FROM elasticsearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| סינון לפי ציון |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM elasticsearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE ואופרטורים דומים |
SELECT id, body FROM elasticsearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| שאילתות גולמיות |
SELECT id, body FROM elasticsearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|