AlloyDB から OpenSearch データにアクセスする

AlloyDB の外部検索統合を使用して、OpenSearch に保存されているデータにアクセスして検索できます。この統合により、データを移動またはコピーすることなく、OpenSearch インデックスを AlloyDB のリレーショナル テーブルと結合できます。

始める前に

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

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 クラスタへのアクセスを構成します。

  1. external_search_fdw 拡張機能を有効にします。

    CREATE EXTENSION external_search_fdw;
    
  2. 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: 外部データサーバーの名前。例: opensearch

    • OPENSEARCH_SERVER_HOST_PORT: OpenSearch クラスタの一般公開 URL(エンドポイント)。

    • SECRET_PATH: OpenSearch 認証情報の Secret Manager パス。例: projects/123456789012/secrets/opensearch-credentials/versions/1123456789012 は、 Google Cloud プロジェクト ID を表します。

  3. OpenSearch サーバーの PostgreSQL ユーザー マッピングを定義します。PostgreSQL FDW が機能するには、このユーザー マッピングが必要です。AlloyDB は、REST 認証ヘッダーを使用して認証します。

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. 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-table

    • OPENSEARCH_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

byte,

short

SMALLINT
date TIMESTAMPTZ

double,

scaled_float

DOUBLE PRECISION

float,

half_float

REAL
integer INTEGER
long BIGINT

object,

flattened

jsonb

text,

keyword,

constant_keyword,

wildcard

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 < 105

  • QUERY: 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: 返される結果の数。例: 10

  • WEIGHT: この検索エントリの Reciprocal Rank Fusion(RRF)全体への貢献度。例: 0.5

  • OPENSEARCH_FD_TABLE: OpenSearch テーブルを表す外部データテーブルの名前。例: my-fd-opensearch-table

  • QUERY: 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 フィールド
  • ORDER BY ... DESC の並べ替え
  • LIMIT
テキストの完全一致
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT フィールド
  • WHERE 個のフィルタ
  • LIMIT
単一フィールド式
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT フィールド
  • WHERE 個のフィルタ
定数式
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT フィールド
  • WHERE 個のフィルタ
  • LIMIT
関数を含む式
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT フィールド
複数フィールドの式
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT フィールド
スコアのフィルタリング
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT フィールド
  • ORDER BY ... DESC の並べ替え
LIKE と同様の演算子
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT フィールド
  • WHERE id > 10 個のフィルタ
未加工のクエリ
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT フィールド
  • ORDER BY ... DESC の並べ替え

トラブルシューティング

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 クラスタで構成された基本認証(ユーザー名とパスワード)を使用する必要があります。

次のステップ