從 AlloyDB Omni 存取 OpenSearch 資料

您可以使用 AlloyDB Omni 的外部搜尋整合功能,存取及搜尋儲存在 OpenSearch 中的資料。這項整合功能可讓您在現有的 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 叢集的存取權。

  1. 連線至資料庫並啟用擴充功能:

    CREATE EXTENSION external_search_fdw;
    
  2. 建立外部伺服器:

    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。

  3. 定義 OpenSearch 伺服器的使用者對應:

    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。

查詢 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 叢集中設定的基本驗證 (使用者名稱和密碼)。

後續步驟