Mengakses data OpenSearch dari AlloyDB

Anda dapat mengakses dan menelusuri data yang disimpan di OpenSearch menggunakan integrasi penelusuran eksternal di AlloyDB. Integrasi ini memungkinkan Anda menggabungkan indeks OpenSearch dengan tabel relasional di AlloyDB tanpa memindahkan atau menyalin data.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menyelesaikan hal berikut:

Menyimpan kredensial OpenSearch di Secret Manager

AlloyDB menyimpan dan membaca kredensial OpenSearch Anda dari Secret Manager. Untuk mengetahui informasi selengkapnya tentang cara menggunakan Secret Manager, lihat Membuat dan mengakses secret menggunakan Secret Manager.

Pastikan akun layanan AlloyDB Anda memiliki peran Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) untuk membaca secret dari Secret Manager. Untuk mengetahui informasi selengkapnya, lihat Membuat dan mengakses secret menggunakan Secret Manager.

Mengaktifkan dan mengonfigurasi ekstensi external_search_fdw

Untuk memulai integrasi dengan OpenSearch, konfigurasi akses ke cluster OpenSearch Anda melalui server data asing.

  1. Aktifkan ekstensi external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. Buat server untuk cluster OpenSearch Anda.

    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'
    );
    

    Ganti variabel berikut:

    • OPENSEARCH_SERVER_NAME: nama untuk server data asing Anda. Contoh, opensearch.

    • OPENSEARCH_SERVER_HOST_PORT: URL yang menghadap publik (endpoint) untuk cluster OpenSearch Anda.

    • SECRET_PATH: Jalur Secret Manager ke kredensial autentikasi OpenSearch Anda. Contoh, projects/123456789012/secrets/opensearch-credentials/versions/1. 123456789012 mewakili Google Cloud project ID Anda.

  3. Tentukan pemetaan pengguna PostgreSQL untuk server OpenSearch. Perhatikan bahwa FDW PostgreSQL memerlukan pemetaan pengguna ini agar dapat berfungsi. AlloyDB melakukan autentikasi menggunakan header otorisasi REST.

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. Petakan skema indeks OpenSearch Anda ke tabel asing 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'
           );
    

    Ganti variabel baru berikut:

    • OPENSEARCH_FD_TABLE: nama tabel data asing yang merepresentasikan tabel OpenSearch Anda. Contoh, my-fd-opensearch-table.

    • OPENSEARCH_FIELDS: daftar yang dipisahkan koma dengan setiap entri menggunakan format opensearch_field_name PG_DATA_TYPE. Untuk mengetahui daftar jenis data OpenSearch yang didukung dan jenis PostgreSQL yang sesuai, lihat Jenis data yang didukung.

    • OPENSEARCH_INDEX_NAME: nama indeks OpenSearch Anda. Contoh, my-opensearch-index.

Jenis data yang didukung

AlloyDB mendukung jenis data OpenSearch berikut:

Jenis data Jenis AlloyDB
alias Jenis PostgreSQL untuk kolom yang dirujuk oleh alias
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

Membuat kueri data OpenSearch

AlloyDB mengambil kueri SQL dan mengonversinya menjadi kueri OpenSearch REST API.

Untuk membuat kueri data OpenSearch, Anda memiliki opsi berikut:

  • Kueri SQL standar
  • DSL Kueri
  • Penelusuran hybrid

Kueri SQL standar

Anda dapat menggunakan SQL standar dengan sintaksis Lucene untuk ekspresi penelusuran.

SELECT id, body
FROM OPENSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';

Ganti variabel berikut:

  • OPENSEARCH_FD_TABLE: Nama tabel data asing yang merepresentasikan tabel OpenSearch Anda. Contoh, my-fd-opensearch-table.

  • (Opsional) FILTER: Filter yang akan diterapkan ke kueri OpenSearch Anda. Contoh, a = 10 AND b < 105.

  • QUERY: Kueri yang akan dikirim ke OpenSearch. Contoh, body:database.

DSL Kueri

Untuk kasus penggunaan lanjutan, gunakan DSL Kueri gaya JSON OpenSearch.

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;

Ganti OPENSEARCH_FD_TABLE dengan nama tabel data asing yang merepresentasikan tabel OpenSearch Anda. Contoh, my-fd-opensearch-table.

Untuk melakukan penelusuran campuran pada data OpenSearch, gabungkan hasil penelusuran token OpenSearch dengan hasil penelusuran vektor 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;

Ganti variabel berikut:

  • LIMIT: jumlah hasil yang akan ditampilkan. Contoh, 10.

  • WEIGHT: kontribusi entri penelusuran ini terhadap keseluruhan Reciprocal Rank Fusion (RRF). Contoh, 0.5.

  • OPENSEARCH_FD_TABLE: nama tabel data asing yang merepresentasikan tabel OpenSearch Anda. Contoh, my-fd-opensearch-table.

  • QUERY: kueri yang akan dikirim ke OpenSearch. Misalnya, "opensearch_field_name:\"cloud databases\"" menelusuri frasa "cloud database" di kolom opensearch_field_name.

Contoh pushdown

Untuk membuat kueri lebih efisien, AlloyDB mencoba mendorong aspek kueri berikut langsung ke panggilan API yang dilakukan ke OpenSearch:

  • SELECT kolom
  • Filter WHERE
  • ORDER BY jenis
  • LIMIT

Untuk contoh kueri yang menggambarkan aspek yang dapat dan tidak dapat didorong ke bawah oleh AlloyDB, lihat tabel berikut.

Jenis kueri Contoh kueri Elemen kueri didorong ke bawah
Kueri yang tidak difilter
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT kolom
  • ORDER BY ... DESC pengurutan
  • LIMIT
Pencocokan teks persis
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT kolom
  • Filter WHERE
  • LIMIT
Ekspresi kolom tunggal
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT kolom
  • Filter WHERE
Ekspresi konstanta
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT kolom
  • Filter WHERE
  • LIMIT
Ekspresi dengan fungsi
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT kolom
Ekspresi multi-kolom
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT kolom
Pemfilteran skor
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT kolom
  • ORDER BY ... DESC pengurutan
LIKE dan operator serupa
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT kolom
  • Filter WHERE id > 10
Kueri mentah
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT kolom
  • ORDER BY ... DESC pengurutan

Pemecahan masalah

Jika Anda mengalami masalah autentikasi atau konektivitas saat membuat kueri cluster OpenSearch, periksa penyebab umum berikut:

  • Error autentikasi HTTP 401 atau 403: Verifikasi bahwa secret OpenSearch Anda di Secret Manager berisi string yang diformat sebagai username:password dan akun layanan AlloyDB Anda memiliki peran Secret Manager Secret Accessor (roles/secretmanager.secretAccessor).
  • Waktu koneksi habis: Pastikan konektivitas IP publik keluar diaktifkan di instance AlloyDB utama Anda dan firewall OpenSearch Anda mengizinkan koneksi masuk di port yang ditentukan.

Batasan

Sebelum menghubungkan AlloyDB ke OpenSearch, pahami batasan berikut:

  • Integrasi OpenSearch hanya tersedia di versi utama PostgreSQL 17 dan yang lebih tinggi.

  • AlloyDB membaca, tetapi tidak menulis ke, data OpenSearch.

  • AlloyDB tidak otomatis mengindeks data database Anda ke OpenSearch. Anda bertanggung jawab untuk mengisi indeks OpenSearch dan mempertahankan konsistensi antara data di AlloyDB dan data yang diindeks di OpenSearch.

  • AlloyDB tidak otomatis menyinkronkan skema dengan OpenSearch. Jika skema indeks OpenSearch Anda berubah, Anda harus memperbarui skema tabel asing PostgreSQL yang sesuai secara manual.

  • Jenis OpenSearch khusus, seperti geo_point tidak didukung. Untuk mengetahui daftar lengkap jenis data yang didukung, lihat Jenis data yang didukung.

  • Anda harus menggunakan autentikasi Dasar (nama pengguna dan sandi) yang dikonfigurasi di cluster OpenSearch Anda.

Langkah berikutnya