AlloyDB for PostgreSQL の外部検索統合を使用して、Apache Solr に保存されているデータにアクセスして検索できます。
始める前に
始める前に、以下が完了していることを確認してください。
プライマリ AlloyDB インスタンスにアウトバウンド パブリック IP 接続を追加します。
アクセス可能な一般公開 URL を使用して Solr クラスタをデプロイして実行します。
Solr 認証情報を Secret Manager に保存する
AlloyDB は、Solr の認証情報を Secret Manager から保存して読み取ります。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: 外部データサーバーの名前。例:solrSOLR_SERVER_HOST_PORT: SOLR クラスタの一般公開 URL。例:https://node1.solr.test.com:8983AUTH_METHOD: 使用する認証のタイプ。例:BasicSECRET_PATH: Solr 認証情報への Secret Manager パス。たとえば、projects/123456789012/secrets/apikey/versions/1です。123456789012は、実際の Google Cloud プロジェクト ID を表します。
Solr サーバーの PostgreSQL ユーザー マッピングを定義します。PostgreSQL FDW が機能するには、このユーザー マッピングが必要です。AlloyDB は、REST 認証ヘッダーを使用して認証を行います。
CREATE USER MAPPING FOR CURRENT_USER SERVER SOLR_SERVER_NAME;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-tableSOLR_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 クエリ
- Query 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 < 105QUERY: Solr に送信するクエリ。例:body:database
Query 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: 返される結果の数。例:10WEIGHT: この検索エントリの Reciprocal Rank Fusion(RRF)全体に対する貢献度。例:0.5SOLR_FD_TABLE: Solr テーブルを表す外部データテーブルの名前。例:my-fd-solr-tableQUERY: Solr に送信するクエリ。たとえば、"solr_field_name:\"cloud databases\""はsolr_field_nameフィールドで「クラウド データベース」というフレーズを検索します。
トラブルシューティング
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など)を指定できます。
次のステップ
- OpenSearch データにアクセスする方法を確認する。
- Elasticsearch データにアクセスする方法を学習する。
- ハイブリッド ベクトル類似性検索を実行する方法を確認する。