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:
Aktifkan konektivitas keluar di instance AlloyDB utama Anda.
Buat dan konfigurasi OpenSearch dengan endpoint publik yang dapat diakses.
Aktifkan plugin keamanan di cluster OpenSearch Anda dan buat pengguna hanya baca di database pengguna internal. AlloyDB menggunakan kredensial ini untuk mengakses cluster OpenSearch Anda.
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, konfigurasikan akses ke cluster OpenSearch Anda melalui server data asing.
Aktifkan ekstensi
external_search_fdw.CREATE EXTENSION external_search_fdw;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 ditampilkan secara publik (endpoint) untuk cluster OpenSearch Anda.SECRET_PATH: Jalur Secret Manager ke kredensial autentikasi OpenSearch Anda. Contoh,projects/123456789012/secrets/opensearch-credentials/versions/1.123456789012mewakili project ID Google Cloud Anda.
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;Memetakan 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 mewakili tabel OpenSearch Anda. Contoh,my-fd-opensearch-table.OPENSEARCH_FIELDS: daftar yang dipisahkan koma dengan setiap entri menggunakan formatopensearch_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
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
Membuat kueri data OpenSearch Anda
AlloyDB mengambil kueri SQL dan mengonversinya menjadi kueri REST API OpenSearch.
Untuk mengkueri data OpenSearch, Anda memiliki opsi berikut:
- Kueri SQL standar
- DSL Kueri
- Penelusuran campuran
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 mewakili 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 bergaya 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 mewakili tabel OpenSearch Anda. Contoh, my-fd-opensearch-table.
Penelusuran campuran
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 Reciprocal Rank Fusion (RRF) secara keseluruhan. Contoh,0.5.OPENSEARCH_FD_TABLE: nama tabel data asing yang mewakili tabel OpenSearch Anda. Contoh,my-fd-opensearch-table.QUERY: kueri yang akan dikirim ke OpenSearch. Misalnya,"opensearch_field_name:\"cloud databases\""menelusuri frasa "cloud databases" di kolomopensearch_field_name.
Contoh pushdown
Agar kueri lebih efisien, AlloyDB mencoba mendorong aspek kueri berikut langsung ke panggilan API yang dibuat ke OpenSearch:
SELECTkolomWHEREfilterORDER BYpengurutanLIMIT
Untuk contoh kueri yang menggambarkan aspek mana yang dapat dan tidak dapat didorong oleh AlloyDB, lihat tabel berikut.
| Jenis kueri | Contoh kueri | Elemen kueri yang didorong ke bawah |
|---|---|---|
| Kueri yang tidak difilter |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| Kecocokan teks persis |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| Ekspresi kolom tunggal |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| Ekspresi konstanta |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| Ekspresi dengan fungsi |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| Ekspresi multi-kolom |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| Pemfilteran skor |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE dan operator serupa |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| Kueri mentah |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
Pemecahan masalah
Jika Anda mengalami masalah autentikasi atau konektivitas saat mengkueri cluster OpenSearch, periksa penyebab umum berikut:
- Error autentikasi HTTP 401 atau 403: Pastikan secret OpenSearch Anda di Secret Manager berisi string yang diformat sebagai
username:passworddan akun layanan AlloyDB Anda memiliki peran Secret Manager Secret Accessor (roles/secretmanager.secretAccessor). - Waktu tunggu koneksi: Pastikan konektivitas IP publik keluar diaktifkan di instance AlloyDB utama Anda dan firewall OpenSearch Anda mengizinkan koneksi masuk pada port yang ditentukan.
Batasan
Sebelum menghubungkan AlloyDB ke OpenSearch, pahami batasan berikut:
Integrasi OpenSearch hanya tersedia di PostgreSQL versi utama
17dan 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 berubah, Anda harus memperbarui skema tabel asing PostgreSQL yang sesuai secara manual.
Jenis OpenSearch khusus, seperti
geo_pointtidak 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
- Pelajari cara Mengakses data Elasticsearch.
- Pelajari cara Mengakses data Solr.
- Pelajari cara Menjalankan penelusuran kemiripan vektor campuran.