您可以使用 AlloyDB Omni 的外部搜尋整合功能,存取及搜尋儲存在 OpenSearch 中的資料。這項整合功能可讓您在現有的 OpenSearch 索引和關聯資料表之間執行聯合搜尋,不必複製或移動資料。
事前準備
開始之前,請先完成下列操作:
- 使用容器安裝 AlloyDB Omni。
- 部署及設定 OpenSearch,並提供可存取的公開端點。
- 在 OpenSearch 叢集上啟用安全性外掛程式,並在內部使用者資料庫中建立唯讀權限使用者。AlloyDB Omni 會使用這些憑證存取 OpenSearch 叢集。
將 OpenSearch 憑證儲存在 Secret Manager
AlloyDB Omni 會從 Secret Manager 儲存及讀取 OpenSearch 憑證。如果是基本 HTTP 驗證,Secret Manager 中的 Secret 值必須是格式為 username:password 的字串。如要進一步瞭解如何使用 Secret Manager,請參閱「使用 Secret Manager 建立及存取密鑰」。
請確認 AlloyDB Omni 使用的服務帳戶具備 secretmanager.secretAccessor 權限,可從 Secret Manager 讀取密鑰。詳情請參閱「管理密鑰存取權」。
啟用及設定 external_search_fdw 擴充功能
如要開始與 OpenSearch 整合,請透過外部資料伺服器設定 OpenSearch 叢集的存取權。
連線至資料庫並啟用擴充功能:
CREATE EXTENSION external_search_fdw;建立外部伺服器:
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 'AUTH_METHOD', secret_path 'SECRET_PATH' );請替換下列變數:
OPENSEARCH_SERVER_NAME:外部資料伺服器的名稱。例如:opensearch。OPENSEARCH_SERVER_HOST_PORT:OpenSearch 叢集的公開網址。例如:https://search-my-domain.us-east-1.es.amazonaws.com:443。AUTH_METHOD:要使用的驗證類型。例如:Basic。SECRET_PATH:OpenSearch 驗證憑證的 Secret Manager 路徑。例如:projects/PROJECT_ID/secrets/opensearch-credentials/versions/1。
定義 OpenSearch 伺服器的使用者對應:
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。
查詢 OpenSearch 資料
AlloyDB Omni 會將 SQL 查詢轉換為 OpenSearch REST API 查詢。
標準 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 Omni 向量搜尋結果彙整。
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 的查詢。例如:body:database。
疑難排解
查詢 OpenSearch 叢集時,如果遇到驗證或連線能力問題,請檢查下列事項:
HTTP 401 或 403 驗證錯誤:確認 Secret Manager 中的 OpenSearch 密鑰包含格式為
username:password的字串,且服務帳戶具備secretmanager.secretAccessor權限。連線逾時:確認 AlloyDB Omni 和 OpenSearch 端點之間的網路規則和防火牆設定。
限制
唯讀:AlloyDB Omni 會讀取 OpenSearch 資料,但不會寫入。
資料管理:AlloyDB Omni 不會自動將資料庫資料編入 OpenSearch 索引。您必須負責填入 OpenSearch 索引,並確保 AlloyDB Omni 中的資料與 OpenSearch 中的索引資料一致。
結構定義管理:AlloyDB Omni 不會自動與 OpenSearch 同步處理結構定義。如果 OpenSearch 索引結構定義有所變更,請手動更新對應 PostgreSQL 外部資料表的結構定義。
不支援的類型:不支援專門的 OpenSearch 類型,例如地理空間類型。
驗證:必須使用在 OpenSearch 叢集中設定的基本驗證 (使用者名稱和密碼)。
後續步驟
瞭解如何存取 Elasticsearch 資料。
瞭解如何存取 Solr 資料。
瞭解如何執行混合型向量相似度搜尋。