從 AlloyDB 存取 OpenSearch 資料

您可以使用 AlloyDB 的外部搜尋整合功能,存取及搜尋儲存在 OpenSearch 中的資料。這項整合功能可讓您彙整 OpenSearch 索引和 AlloyDB 中的關聯式資料表,不必移動或複製資料。

事前準備

開始之前,請確認您已完成下列事項:

在 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 叢集的存取權。

  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:OpenSearch 叢集的公開網址 (端點)。

    • SECRET_PATH:OpenSearch 驗證憑證的 Secret Manager 路徑。例如,projects/123456789012/secrets/opensearch-credentials/versions/1123456789012 代表您的 Google Cloud 專案 ID。

  3. 為 OpenSearch 伺服器定義 PostgreSQL 使用者對應。請注意,PostgreSQL FDW 需要這個使用者對應才能運作。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 alias參照的欄位 PostgreSQL 類型
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 查詢,並將其轉換為 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 個欄位
  • 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 驗證錯誤:確認 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 叢集中設定的基本驗證 (使用者名稱和密碼)。

後續步驟