從 AlloyDB for PostgreSQL 存取 Solr 資料

您可以使用 AlloyDB for PostgreSQL 的外部搜尋整合功能,存取及搜尋儲存在 Apache Solr 中的資料。

事前準備

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

將 Solr 憑證儲存在 Secret Manager

AlloyDB 會從 Secret Manager 儲存及讀取 Solr 憑證。如果是基本驗證,Secret Manager 中的密鑰值必須是採用 username:password 格式的 Base64 編碼字串。如要進一步瞭解如何使用 Secret Manager,請參閱「使用 Secret Manager 建立及存取密鑰」。

請確認 AlloyDB 服務帳戶具備 Secret Manager 密鑰存取者 (roles/secretmanager.secretAccessor) 角色,可讀取 Secret Manager 中的密鑰。詳情請參閱「使用 Secret Manager 建立及存取 Secret」。

啟用及設定 external_search_fdw 擴充功能

如要開始與 Solr 整合,請透過外部資料伺服器設定 Solr 叢集的存取權。

CREATE EXTENSION external_search_fdw;

CREATE SERVER SOLR_SERVER_NAME
FOREIGN DATA WRAPPER external_search_fdw
OPTIONS (
  server 'SOLR_SERVER_HOST_PORT',
  search_provider 'solr',
  auth_mode 'secret_manager',
  auth_method 'AUTH_METHOD',
  secret_path 'SECRET_PATH'
);

請替換下列變數:

  • SOLR_SERVER_NAME:外部資料伺服器的名稱。例如:solr。

  • SOLR_SERVER_HOST_PORT:SOLR 叢集的公開網址。例如:https://node1.solr.test.com:8983。

  • AUTH_METHOD:要使用的驗證類型。例如:Basic。

  • SECRET_PATH:Solr 驗證憑證的 Secret Manager 路徑。例如:projects/123456789012/secrets/apikey/versions/1。123456789012代表您的 Google Cloud 專案 ID。

  1. 定義 Solr 伺服器的 PostgreSQL 使用者對應。請注意,PostgreSQL FDW 必須有這項使用者對應才能運作。AlloyDB 會使用 REST 授權標頭進行驗證。

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER SOLR_SERVER_NAME;
    
  2. 將 Solr 集合的結構定義對應至 PostgreSQL 外部資料表。

    CREATE FOREIGN TABLE SOLR_FD_TABLE(
        metadata external_search_fdw_schema.OpaqueMetadata,
        SOLR_FIELDS)
           SERVER SOLR_SERVER_NAME
           OPTIONS(
                remote_table_name 'SOLR_COLLECTION_NAME'
                unique_key_sort_suffix 'UNIQUE_KEY_SORT_SUFFIX'
           );
    

    替換下列新變數:

    • SOLR_FD_TABLE:代表 Solr 資料表的外部資料表名稱。例如:my-fd-solr-table。

    • SOLR_FIELDS:以半形逗號分隔的清單,每個項目的格式均為 solr_field_name PG_DATA_TYPE。如需支援的 Solr 資料類型及其對應的 PostgreSQL 類型清單,請參閱「支援的資料類型」。

    • UNIQUE_KEY_SORT_SUFFIX:(選用) Solr 中的專屬索引鍵欄位,或以半形逗號分隔的多個欄位清單及其排序順序 (例如 myid0 ASC, myid1 DESC),用於分頁。預設值為 id。

    • PG_DATA_TYPE:要對應的 PostgreSQL 類型。常見例子包括:

      • TEXT:用於字串資料。
      • INTEGER:用於數值資料。
    • SOLR_COLLECTION_NAME:Solr 集合的名稱。例如:my-solr-collection。

查詢 Solr 資料

AlloyDB 會擷取 SQL 查詢,並轉換為 Solr REST API 查詢。

如要查詢 Solr 資料,可以選擇下列做法:

  • 標準 SQL 查詢
  • 查詢 DSL
  • 混合型搜尋

標準 SQL 查詢

您可以使用標準 SQL 搭配 Lucene 語法來編寫搜尋運算式。

SELECT id, body
FROM SOLR_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';

請替換下列變數:

  • SOLR_FD_TABLE: 代表 Solr 資料表的外部資料表名稱。例如:my-fd-solr-table。

  • (選用) FILTER:要套用至 Solr 查詢的篩選器。例如:AND qubits < 105。

  • QUERY:要傳送至 Solr 的查詢。例如:body:database。

查詢 DSL

如需進階用途,請使用 Solr JSON 樣式的查詢 DSL。

SELECT id, title
FROM SOLR_FD_TABLE
ORDER BY metadata <@> $${
  "query": "title:solr",
  "filter": ["category:software", "inStock:true"],
  "sort": "price desc"
}$$
LIMIT 1;

將 SOLR_FD_TABLE 替換為代表 Solr 資料表的外部資料表名稱。例如 my-fd-solr-table。

如要對 Solr 資料執行混合型搜尋,請將 Solr 權杖搜尋結果與 AlloyDB 向量搜尋結果彙整。

SELECT *
FROM ai.hybrid_search(
  ARRAY[
    '{"limit": LIMIT,
      "weight": WEIGHT,
      "table_name": "SOLR_FD_TABLE",
      "key_column": "id",
      "query_text_input": "QUERY"}'::jsonb
  ])
ORDER BY score DESC;

請替換下列變數:

  • LIMIT:要傳回的結果數量。例如:10。

  • WEIGHT:這個搜尋項目對整體倒數排名融合 (RRF) 的貢獻。例如:0.5。

  • SOLR_FD_TABLE: 代表 Solr 資料表的外部資料表名稱。例如:my-fd-solr-table。

  • QUERY:要傳送至 Solr 的查詢。例如,"solr_field_name:\"cloud databases\"" 會在 solr_field_name 欄位中搜尋「cloud databases」這個詞組。

疑難排解

查詢 Solr 叢集時,如果遇到驗證或連線能力問題,請檢查下列常見原因:

  • HTTP 401 或 403 驗證錯誤:確認 Secret Manager 中的 Solr 密鑰包含採用 username:password 格式的 Base64 編碼字串,且 AlloyDB 使用的服務帳戶具備 secretmanager.secretAccessor 權限。
  • 連線逾時:確認主要 AlloyDB 執行個體已啟用傳出公開 IP 連線,且 Solr 防火牆允許指定通訊埠的傳入連線。

限制

將 AlloyDB 連結至 Solr 之前,請先瞭解下列限制:

  • Solr 整合功能僅適用於 PostgreSQL 主要版本 17 以上。

  • AlloyDB 會讀取 Solr 資料,但不會寫入。

  • AlloyDB 不會自動將資料庫資料編入 Solr 索引。您必須負責填入 Solr 集合,並確保 AlloyDB 資料與 Solr 索引資料一致。

  • AlloyDB 不會自動與 Solr 同步處理結構定義。如果 Solr 集合結構定義有所變更,您必須手動更新對應 PostgreSQL 外部資料表的結構定義。

  • 與 Elasticsearch 不同,Solr 沒有預先定義的 JSON 類型欄位。您必須將 JSON 類型的欄位對應至 TEXT 或 jsonb 格式的字串。

  • Solr 需要排序運算式中的專屬鍵,才能正確分頁。根據預設,系統會使用 id 欄位。建立外部資料表時,您可以使用 unique_key_sort_suffix 選項指定自訂欄位,或以逗號分隔的多個欄位清單,以及個別的排序順序,例如 myid0 ASC, myid1 DESC。

後續步驟