您可以使用 AlloyDB 的外部搜尋整合功能,存取及搜尋儲存在 OpenSearch 中的資料。這項整合功能可讓您彙整 OpenSearch 索引和 AlloyDB 中的關聯式資料表,不必移動或複製資料。
事前準備
開始之前,請確認您已完成下列事項:
建立叢集。
在主要 AlloyDB 執行個體上啟用輸出連線。
建立及設定 OpenSearch,並提供可存取的公開端點。
在 OpenSearch 叢集上啟用安全外掛程式,並在內部使用者資料庫中建立唯讀權限使用者。AlloyDB 會使用這些憑證存取 OpenSearch 叢集。
在 Secret Manager 中儲存 OpenSearch 憑證
AlloyDB 會從 Secret Manager 儲存及讀取 OpenSearch 憑證。如要進一步瞭解如何使用 Secret Manager,請參閱「使用 Secret Manager 建立及存取密鑰」。
請確認 AlloyDB 服務帳戶具備 Secret Manager 密鑰存取者 (roles/secretmanager.secretAccessor) 角色,可從 Secret Manager 讀取密鑰。詳情請參閱「使用 Secret Manager 建立及存取密鑰」。
啟用及設定 external_search_fdw 擴充功能
如要開始整合 OpenSearch,請透過外部資料伺服器設定 OpenSearch 叢集的存取權。
啟用
external_search_fdw擴充功能。CREATE EXTENSION external_search_fdw;為 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:OpenSearch 叢集的公開網址 (端點)。SECRET_PATH:OpenSearch 驗證憑證的 Secret Manager 路徑。例如,projects/123456789012/secrets/opensearch-credentials/versions/1。123456789012代表您的 Google Cloud 專案 ID。
為 OpenSearch 伺服器定義 PostgreSQL 使用者對應。請注意,PostgreSQL FDW 需要這個使用者對應才能運作。AlloyDB 會使用 REST 授權標頭進行驗證。
CREATE USER MAPPING FOR CURRENT_USER SERVER OPENSEARCH_SERVER_NAME;將 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
|
alias參照的欄位 PostgreSQL 類型
|
binary
|
bytea
|
boolean
|
BOOLEAN
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
查詢 OpenSearch 資料
AlloyDB 會接收 SQL 查詢,並將其轉換為 OpenSearch REST API 查詢。
如要查詢 OpenSearch 資料,您可以選擇下列方式:
- 標準 SQL 查詢
- 查詢 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。
查詢 DSL
如要瞭解進階用途,請使用 OpenSearch JSON 樣式的查詢 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:這項搜尋項目對整體互惠排序融合 (RRF) 的貢獻。例如:0.5。OPENSEARCH_FD_TABLE:代表 OpenSearch 資料表的外來資料表名稱。例如:my-fd-opensearch-table。QUERY:要傳送至 OpenSearch 的查詢。舉例來說,"opensearch_field_name:\"cloud databases\""會在opensearch_field_name欄位中搜尋「雲端資料庫」這個詞組。
下推式廣告範例
為提高查詢效率,AlloyDB 會嘗試將查詢的下列部分直接推送至對 OpenSearch 進行的 API 呼叫:
SELECT個欄位WHERE個篩選器ORDER BY排序LIMIT
如需範例查詢,瞭解 AlloyDB 能和不能下推的層面,請參閱下表。
| 查詢類型 | 查詢示例 | 查詢元素向下推移 |
|---|---|---|
| 未經過濾的查詢 |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| 完全比對文字 |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| 單一欄位運算式 |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| 常數運算式 |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| 含函式的運算式 |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| 多欄位運算式 |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| 分數篩選 |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE 和類似運算子 |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| 原始查詢 |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
疑難排解
查詢 OpenSearch 叢集時,如果遇到驗證或連線問題,請檢查下列常見原因:
- HTTP 401 或 403 驗證錯誤:確認 Secret Manager 中的 OpenSearch Secret 包含格式為
username:password的字串,且 AlloyDB 服務帳戶具有 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) 角色。 - 連線逾時:確認主要 AlloyDB 執行個體已啟用輸出公開 IP 連線,且 OpenSearch 防火牆允許指定通訊埠的連入連線。
限制
將 AlloyDB 連線至 OpenSearch 前,請先瞭解下列限制:
OpenSearch 整合功能僅適用於 PostgreSQL 主要版本
17以上。AlloyDB 會讀取 OpenSearch 資料,但不會寫入。
AlloyDB 不會自動將資料庫資料編入 OpenSearch 索引。您必須負責填入 OpenSearch 索引,並確保 AlloyDB 中的資料與 OpenSearch 中的索引資料一致。
AlloyDB 不會自動與 OpenSearch 同步處理結構定義。如果 OpenSearch 索引結構定義有變更,您必須手動更新對應 PostgreSQL 外部資料表的結構定義。
系統不支援專用 OpenSearch 類型,例如
geo_point。如需支援的資料類型完整清單,請參閱「支援的資料類型」。您必須使用在 OpenSearch 叢集中設定的基本驗證 (使用者名稱和密碼)。
後續步驟
- 瞭解如何存取 Elasticsearch 資料。
- 瞭解如何存取 Solr 資料。
- 瞭解如何執行混合型向量相似度搜尋。