從 AlloyDB for PostgreSQL 存取 Solr 資料

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

限制

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

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

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

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

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

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

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

事前準備

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

  • 在主要 AlloyDB 執行個體上新增傳出公開 IP 連線

  • 部署及執行 Solr 叢集,並提供可存取的對外公開網址。

  • 將 Solr 憑證儲存在 Secret Manager 中。如要使用基本驗證,密碼值必須是採用 base64 編碼的字串,格式為 username:password

  • 請確認 AlloyDB 使用的服務帳戶具備 secretmanager.secretAccessor 權限,可從 Secret Manager 讀取密鑰。

啟用及設定 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/1123456789012 代表您的 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 欄位中搜尋「雲端資料庫」這個詞組。