AlloyDB の外部検索統合を使用して、OpenSearch に保存されているデータにアクセスして検索できます。この統合により、データを移動またはコピーすることなく、OpenSearch インデックスを AlloyDB のリレーショナル テーブルと結合できます。
始める前に
始める前に、以下が完了していることを確認してください。
プライマリ AlloyDB インスタンスでアウトバウンド接続を有効にします。
アクセス可能なパブリック エンドポイントを使用して OpenSearch を作成して構成します。
OpenSearch クラスタでセキュリティ プラグインを有効にし、内部ユーザー データベースに読み取り権限のみのユーザーを作成します。AlloyDB は、これらの認証情報を使用して OpenSearch クラスタにアクセスします。
OpenSearch 認証情報を Secret Manager に保存する
AlloyDB は、Secret Manager から OpenSearch 認証情報を保存して読み取ります。Secret Manager の使用方法については、Secret Manager を使用してシークレットを作成してアクセスするをご覧ください。
AlloyDB サービス アカウントに、Secret Manager からシークレットを読み取るための Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor)ロールが付与されていることを確認します。詳細については、Secret Manager を使用してシークレットを作成してアクセスするをご覧ください。
external_search_fdw 拡張機能を有効にして構成する
OpenSearch との統合を開始するには、外部データサーバーを介して OpenSearch クラスタへのアクセスを構成します。
external_search_fdw拡張機能を有効にします。CREATE EXTENSION external_search_fdw;OpenSearch クラスタ用のサーバーを作成します。
CREATE SERVER OPENSEARCH_SERVER_NAME FOREIGN DATA WRAPPER external_search_fdw OPTIONS ( server 'OPENSEARCH_SERVER_HOST_PORT', search_provider 'opensearch', auth_mode 'secret_manager', auth_method 'Basic', secret_path 'SECRET_PATH' );次の変数を置き換えます。
OPENSEARCH_SERVER_NAME: 外部データサーバーの名前。例:opensearchOPENSEARCH_SERVER_HOST_PORT: OpenSearch クラスタの一般公開 URL(エンドポイント)。SECRET_PATH: OpenSearch 認証情報の Secret Manager パス。例:projects/123456789012/secrets/opensearch-credentials/versions/1123456789012は、 Google Cloud プロジェクト ID を表します。
OpenSearch サーバーの PostgreSQL ユーザー マッピングを定義します。PostgreSQL FDW が機能するには、このユーザー マッピングが必要です。AlloyDB は、REST 認証ヘッダーを使用して認証します。
CREATE USER MAPPING FOR CURRENT_USER SERVER OPENSEARCH_SERVER_NAME;OpenSearch インデックスのスキーマを PostgreSQL 外部テーブルにマッピングします。
CREATE FOREIGN TABLE OPENSEARCH_FD_TABLE( metadata external_search_fdw_schema.OpaqueMetadata, OPENSEARCH_FIELDS) SERVER OPENSEARCH_SERVER_NAME OPTIONS( remote_table_name 'OPENSEARCH_INDEX_NAME' );次の新しい変数を置き換えます。
OPENSEARCH_FD_TABLE: OpenSearch テーブルを表す外部データテーブルの名前。例:my-fd-opensearch-tableOPENSEARCH_FIELDS: 各エントリがopensearch_field_name PG_DATA_TYPE形式を使用するカンマ区切りのリスト。サポートされている OpenSearch データ型と、それに対応する PostgreSQL 型の一覧については、サポートされているデータ型をご覧ください。OPENSEARCH_INDEX_NAME: OpenSearch インデックスの名前。例:my-opensearch-index
サポートされるデータタイプ
AlloyDB は、次の OpenSearch データ型をサポートしています。
| データの種類 | AlloyDB のタイプ |
|---|---|
alias
|
alias が参照しているフィールドの PostgreSQL タイプ |
binary
|
bytea
|
boolean
|
BOOLEAN
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
OpenSearch データにクエリを実行する
AlloyDB は SQL クエリを受け取り、OpenSearch REST API クエリに変換します。
OpenSearch データをクエリするには、次のオプションがあります。
- 標準 SQL クエリ
- クエリ DSL
- ハイブリッド検索
標準 SQL クエリ
検索式には、Lucene 構文の標準 SQL を使用できます。
SELECT id, body
FROM OPENSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';
次の変数を置き換えます。
OPENSEARCH_FD_TABLE: OpenSearch テーブルを表す外部データテーブルの名前。例:my-fd-opensearch-table(省略可)
FILTER: OpenSearch クエリに適用するフィルタ。例:a = 10 AND b < 105QUERY: OpenSearch に送信するクエリ。例:body:database
クエリ DSL
高度なユースケースでは、OpenSearch JSON スタイルの Query DSL を使用します。
SELECT id, title
FROM OPENSEARCH_FD_TABLE
ORDER BY metadata <@> $${
"query": {
"bool": {
"must": { "match": { "title": "opensearch" } },
"filter": { "term": { "category": "software" } }
}
},
"sort": [
{ "price": { "order": "desc" } }
]
}$$
LIMIT 1;
OPENSEARCH_FD_TABLE は、OpenSearch テーブルを表す外部データテーブルの名前に置き換えます。例: my-fd-opensearch-table
ハイブリッド検索
OpenSearch データに対してハイブリッド検索を実行するには、OpenSearch トークン検索結果を AlloyDB ベクトル検索結果と結合します。
SELECT *
FROM ai.hybrid_search(
ARRAY[
'{"limit": LIMIT,
"weight": WEIGHT,
"table_name": OPENSEARCH_FD_TABLE,
"key_column": "id",
"query_text_input": "QUERY"}'::jsonb
])
ORDER BY score DESC;
次の変数を置き換えます。
LIMIT: 返される結果の数。例:10WEIGHT: この検索エントリの Reciprocal Rank Fusion(RRF)全体への貢献度。例:0.5OPENSEARCH_FD_TABLE: OpenSearch テーブルを表す外部データテーブルの名前。例:my-fd-opensearch-tableQUERY: OpenSearch に送信するクエリ。たとえば、"opensearch_field_name:\"cloud databases\""はopensearch_field_nameフィールドで「cloud databases」というフレーズを検索します。
プッシュダウンの例
クエリの効率を高めるため、AlloyDB はクエリの次の要素を OpenSearch への API 呼び出しに直接 pushdown しようとします。
SELECTフィールドWHERE個のフィルタORDER BY件の並べ替えLIMIT
AlloyDB がプッシュダウンできる側面とできない側面を示すクエリの例については、次の表をご覧ください。
| クエリの形式 | クエリの例 | プッシュダウンされたクエリ要素 |
|---|---|---|
| フィルタされていないクエリ |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| テキストの完全一致 |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| 単一フィールド式 |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| 定数式 |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| 関数を含む式 |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| 複数フィールドの式 |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| スコアのフィルタリング |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE と同様の演算子 |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| 未加工のクエリ |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
トラブルシューティング
OpenSearch クラスタのクエリ時に認証または接続の問題が発生した場合は、次の一般的な原因を確認してください。
- HTTP 401 または 403 認証エラー: Secret Manager の OpenSearch シークレットに
username:password形式の文字列が含まれていること、AlloyDB サービス アカウントに Secret Manager のシークレット アクセサー(roles/secretmanager.secretAccessor)ロールが付与されていることを確認します。 - 接続タイムアウト: プライマリ AlloyDB インスタンスでアウトバウンド パブリック IP 接続が有効になっていること、および OpenSearch ファイアウォールが指定されたポートでの受信接続を許可していることを確認します。
制限事項
AlloyDB を OpenSearch に接続する前に、次の制限事項を理解しておいてください。
OpenSearch 統合は、PostgreSQL メジャー バージョン
17以降でのみ使用できます。AlloyDB は OpenSearch データの読み取りを行いますが、書き込みは行いません。
AlloyDB は、データベース データを OpenSearch に自動的にインデックス登録しません。OpenSearch インデックスへの入力と、AlloyDB のデータと OpenSearch のインデックス付きデータとの整合性の維持は、ユーザーが行う必要があります。
AlloyDB は、スキーマを OpenSearch と自動的に同期しません。OpenSearch インデックス スキーマが変更された場合は、対応する PostgreSQL 外部テーブルのスキーマを手動で更新する必要があります。
geo_pointなどの特殊な OpenSearch タイプはサポートされていません。サポートされているデータ型の全一覧については、サポートされているデータ型をご覧ください。OpenSearch クラスタで構成された基本認証(ユーザー名とパスワード)を使用する必要があります。
次のステップ
- Elasticsearch データにアクセスする方法を学習する。
- Solr データにアクセスする方法を確認する。
- ハイブリッド ベクトル類似性検索を実行する方法を学ぶ。