AlloyDB Omni の外部検索統合を使用して、Apache 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など)を指定できます。
始める前に
始める前に、以下が完了していることを確認してください。
プライマリ AlloyDB インスタンスにアウトバウンド パブリック IP 接続を追加します。
アクセス可能な一般公開 URL を使用して Solr クラスタをデプロイして実行します。
Solr の認証情報を Secret Manager に保存します。Basic 認証の場合、シークレットの値は
username:password形式の Base64 でエンコードされた文字列である必要があります。AlloyDB で使用されるサービス アカウントに、Secret Manager からシークレットを読み取るための
secretmanager.secretAccessor権限があることを確認します。
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フィールドで「クラウド データベース」というフレーズを検索します。