Accedere ai dati di OpenSearch da AlloyDB

Puoi accedere ai dati archiviati in OpenSearch ed eseguirne la ricerca utilizzando l'integrazione della ricerca esterna in AlloyDB. Questa integrazione ti consente di unire gli indici OpenSearch con le tabelle relazionali in AlloyDB senza spostare o copiare i dati.

Prima di iniziare

Prima di iniziare, assicurati di aver completato le seguenti operazioni:

Archivia le credenziali OpenSearch in Secret Manager

AlloyDB archivia e legge le credenziali OpenSearch da Secret Manager. Per saperne di più su come utilizzare Secret Manager, consulta Creare e accedere a un secret utilizzando Secret Manager.

Assicurati che il account di servizio AlloyDB disponga del ruolo Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) per leggere il secret da Secret Manager. Per saperne di più, consulta Creare e accedere a un secret utilizzando Secret Manager.

Attivare e configurare l'estensione external_search_fdw

Per iniziare l'integrazione con OpenSearch, configura l'accesso al tuo cluster OpenSearch tramite un server di dati esterni.

  1. Attiva l'estensione external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. Crea un server per il cluster 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'
    );
    

    Sostituisci le seguenti variabili:

    • OPENSEARCH_SERVER_NAME: il nome del server di dati esterni. Ad esempio, opensearch.

    • OPENSEARCH_SERVER_HOST_PORT: URL (endpoint) pubblico per il tuo cluster OpenSearch.

    • SECRET_PATH: il percorso di Secret Manager alle credenziali di autenticazione OpenSearch. Ad esempio, projects/123456789012/secrets/opensearch-credentials/versions/1. 123456789012 rappresenta l'ID progetto Google Cloud .

  3. Definisci il mapping degli utenti PostgreSQL per il server OpenSearch. Tieni presente che le FDW PostgreSQL richiedono questa mappatura degli utenti per funzionare. AlloyDB esegue l'autenticazione utilizzando l'intestazione di autorizzazione REST.

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. Mappa lo schema dell'indice OpenSearch a una tabella esterna 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'
           );
    

    Sostituisci le seguenti nuove variabili:

    • OPENSEARCH_FD_TABLE: il nome della tabella di dati esterni che rappresenta la tabella OpenSearch. Ad esempio, my-fd-opensearch-table.

    • OPENSEARCH_FIELDS: un elenco separato da virgole in cui ogni voce utilizza il formato opensearch_field_name PG_DATA_TYPE. Per un elenco dei tipi di dati OpenSearch supportati e dei tipi PostgreSQL corrispondenti, vedi Tipi di dati supportati.

    • OPENSEARCH_INDEX_NAME: il nome dell'indice OpenSearch. Ad esempio, my-opensearch-index.

Tipi di dati supportati

AlloyDB supporta i seguenti tipi di dati OpenSearch:

Tipo/i di dati Tipo AlloyDB
alias Tipo PostgreSQL per il campo a cui fa riferimento 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

Eseguire query sui dati OpenSearch

AlloyDB prende le query SQL e le converte in query API REST di OpenSearch.

Per eseguire query sui dati OpenSearch, hai a disposizione le seguenti opzioni:

  • Query SQL standard
  • Query DSL
  • Ricerche ibride

Query SQL standard

Puoi utilizzare SQL standard con la sintassi Lucene per l'espressione di ricerca.

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

Sostituisci le seguenti variabili:

  • OPENSEARCH_FD_TABLE: il nome della tabella di dati esterni che rappresenta la tabella OpenSearch. Ad esempio, my-fd-opensearch-table.

  • (Facoltativo) FILTER: il filtro da applicare alla query OpenSearch. Ad esempio, a = 10 AND b < 105.

  • QUERY: la query da inviare a OpenSearch. Ad esempio, body:database.

Query DSL

Per casi d'uso avanzati, utilizza il linguaggio specifico del dominio di query in stile JSON di 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;

Sostituisci OPENSEARCH_FD_TABLE con il nome della tabella di dati esterni che rappresenta la tabella OpenSearch. Ad esempio, my-fd-opensearch-table.

Per eseguire una ricerca ibrida sui dati OpenSearch, unisci i risultati della ricerca di token OpenSearch con i risultati della ricerca vettoriale di 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;

Sostituisci le seguenti variabili:

  • LIMIT: il numero di risultati da restituire. Ad esempio, 10.

  • WEIGHT: contributo di questa voce di ricerca alla Reciprocal Rank Fusion (RRF) complessiva. Ad esempio, 0.5.

  • OPENSEARCH_FD_TABLE: il nome della tabella di dati esterni che rappresenta la tabella OpenSearch. Ad esempio, my-fd-opensearch-table.

  • QUERY: query da inviare a OpenSearch. Ad esempio, "opensearch_field_name:\"cloud databases\"" cerca la frase "database cloud" nel campo opensearch_field_name.

Esempi di pushdown

Per rendere le query più efficienti, AlloyDB tenta di eseguire il push dei seguenti aspetti della query direttamente nella chiamata API effettuata a OpenSearch:

  • SELECT campi
  • WHERE filtri
  • ORDER BY ordinamenti
  • LIMIT

Per esempi di query che illustrano gli aspetti che AlloyDB è e non è in grado di eseguire il push verso il basso, consulta la tabella seguente.

Tipo di query Esempio di query Elementi della query spostati in basso
Query non filtrate
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT campi
  • ORDER BY ... DESC ordinamento
  • LIMIT
Corrispondenza esatta del testo
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT campi
  • WHERE filtro
  • LIMIT
Espressioni a campo singolo
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT campi
  • WHERE filtro
Espressioni costanti
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT campi
  • WHERE filtro
  • LIMIT
Espressioni con funzioni
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT campi
Espressioni multi-campo
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT campi
Filtro del punteggio
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT campi
  • ORDER BY ... DESC ordinamento
LIKE e operatori simili
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT campi
  • WHERE id > 10 filtro
Query non elaborate
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT campi
  • ORDER BY ... DESC ordinamento

Risoluzione dei problemi

Se riscontri problemi di autenticazione o connettività durante l'interrogazione del tuo cluster OpenSearch, controlla le seguenti cause comuni:

  • Errori di autenticazione HTTP 401 o 403: verifica che il secret OpenSearch in Secret Manager contenga una stringa formattata come username:password e che il account di servizio AlloyDB disponga del ruolo Secret Manager Secret Accessor (roles/secretmanager.secretAccessor).
  • Timeout di connessione: verifica che la connettività IP pubblica in uscita sia abilitata nell'istanza AlloyDB principale e che il firewall OpenSearch consenta le connessioni in entrata sulla porta specificata.

Limitazioni

Prima di connettere AlloyDB a OpenSearch, tieni presenti le seguenti limitazioni:

  • L'integrazione di OpenSearch è disponibile solo nella versione principale di PostgreSQL 17 e successive.

  • AlloyDB legge i dati di OpenSearch, ma non li scrive.

  • AlloyDB non indicizza automaticamente i dati del database in OpenSearch. Sei responsabile del popolamento degli indici OpenSearch e del mantenimento della coerenza tra i dati in AlloyDB e i dati indicizzati in OpenSearch.

  • AlloyDB non sincronizza automaticamente gli schemi con OpenSearch. Se lo schema dell'indice OpenSearch cambia, devi aggiornare manualmente lo schema della tabella esterna PostgreSQL corrispondente.

  • I tipi OpenSearch specializzati, come geo_point non sono supportati. Per l'elenco completo dei tipi di dati supportati, vedi Tipi di dati supportati.

  • Devi utilizzare l'autenticazione di base (nome utente e password) configurata nel tuo cluster OpenSearch.

Passaggi successivi