您可以使用 AlloyDB 的外部搜尋整合功能,存取及搜尋儲存在 OpenSearch 的資料。這項整合功能可讓您將 OpenSearch 索引與 AlloyDB 中的關聯資料表彙整,不必移動或複製資料。
事前準備
開始之前,請確認您已完成下列事項:
建立叢集。
在主要 AlloyDB 執行個體上啟用傳出連線。
建立及設定 OpenSearch,並提供可存取的公開端點。
在 OpenSearch 叢集上啟用安全性外掛程式,並在內部使用者資料庫中建立唯讀權限使用者。AlloyDB 會使用這些憑證存取 OpenSearch 叢集。
將 OpenSearch 憑證儲存在 Secret Manager
AlloyDB 會從 Secret Manager 儲存及讀取 OpenSearch 憑證。如要進一步瞭解如何使用 Secret Manager,請參閱「使用 Secret Manager 建立及存取密鑰」。
請確認 AlloyDB 服務帳戶具備 Secret Manager 密鑰存取者 (roles/secretmanager.secretAccessor) 角色,可從 Secret Manager 讀取密鑰。詳情請參閱「使用 Secret Manager 建立及存取 Secret」。
啟用及設定 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欄位中搜尋「cloud databases」這個詞組。
下推式廣告範例
為提高查詢效率,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 密鑰包含格式為
username:password的字串,且 AlloyDB 服務帳戶具備 Secret Manager 密鑰存取者 (roles/secretmanager.secretAccessor) 角色。 - 連線逾時:確認主要 AlloyDB 執行個體已啟用傳出公開 IP 連線,且 OpenSearch 防火牆允許指定通訊埠的傳入連線。
限制
將 AlloyDB 連結至 OpenSearch 前,請先瞭解下列限制:
OpenSearch 整合功能僅適用於 PostgreSQL 主要版本
17以上。AlloyDB 會讀取 OpenSearch 資料,但不會寫入。
AlloyDB 不會自動將資料庫資料編入 OpenSearch 索引。您必須負責填入 OpenSearch 索引,並確保 AlloyDB 中的資料與 OpenSearch 中的索引資料一致。
AlloyDB 不會自動與 OpenSearch 同步處理結構定義。如果 OpenSearch 索引結構定義有所變更,您必須手動更新對應 PostgreSQL 外部資料表的結構定義。
您必須使用在 OpenSearch 叢集中設定的基本驗證 (使用者名稱和密碼)。
後續步驟
- 瞭解如何存取 Elasticsearch 資料。
- 瞭解如何存取 Solr 資料。
- 瞭解如何執行混合型向量相似度搜尋。