AlloyDB for PostgreSQL から Solr データにアクセスする

AlloyDB for PostgreSQL の外部検索統合を使用して、Apache Solr に保存されているデータにアクセスして検索できます。

始める前に

始める前に、以下が完了していることを確認してください。

Secret Manager に Solr 認証情報を保存する

AlloyDB は、Secret Manager から Solr 認証情報を保存して読み取ります。Basic 認証の場合、Secret Manager のシークレットの値は、username:password 形式の Base64 でエンコードされた文字列にする必要があります。Secret Manager の使用方法については、Secret Manager を使用してシークレットを作成してアクセスするをご覧ください。

AlloyDB サービス アカウントに、Secret Manager からシークレットを読み取るための Secret Manager のシークレット アクセサー(roles/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 クラスタの公開 URL。例: 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 クエリ

検索式には、Lucene 構文で標準 SQL を使用できます。

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 スタイルの Query 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: この検索エントリが Reciprocal Rank Fusion(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)を指定できます。

次のステップ