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, konfigurasi 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 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.123456789012mewakili Google Cloud project ID 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;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 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
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.
Penelusuran hybrid
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 kolomopensearch_field_name.
Contoh pushdown
Untuk membuat kueri lebih efisien, AlloyDB mencoba mendorong aspek kueri berikut langsung ke panggilan API yang dilakukan ke OpenSearch:
SELECTkolom- Filter
WHERE ORDER BYjenisLIMIT
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; |
|
| Pencocokan 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 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:passworddan 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
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 Anda 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.