Accede a los datos de OpenSearch desde AlloyDB

Puedes acceder a los datos almacenados en OpenSearch y buscarlos con la integración de búsqueda externa en AlloyDB. Esta integración te permite unir índices de OpenSearch con tablas relacionales en AlloyDB sin mover ni copiar datos.

Antes de comenzar

Antes de comenzar, asegúrate de haber completado los siguientes pasos:

Almacena credenciales de OpenSearch en Secret Manager

AlloyDB almacena y lee tus credenciales de OpenSearch desde Secret Manager. Para obtener más información sobre cómo usar Secret Manager, consulta Crea un secreto y accede a él con Secret Manager.

Asegúrate de que tu cuenta de servicio de AlloyDB tenga el rol de Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) para leer el secreto de Secret Manager. Para obtener más información, consulta Crea un secreto y accede a él con Secret Manager.

Habilita y configura la extensión external_search_fdw

Para comenzar la integración con OpenSearch, configura el acceso a tu clúster de OpenSearch a través de un servidor de datos externo.

  1. Habilita la extensión external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. Crea un servidor para tu clúster de 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'
    );
    

    Reemplaza las siguientes variables:

    • OPENSEARCH_SERVER_NAME: Es el nombre de tu servidor de datos externo. Por ejemplo, opensearch

    • OPENSEARCH_SERVER_HOST_PORT: Es la URL (extremo) orientada al público de tu clúster de OpenSearch.

    • SECRET_PATH: Es la ruta de Secret Manager a tus credenciales de autenticación de OpenSearch. Por ejemplo, projects/123456789012/secrets/opensearch-credentials/versions/1 123456789012 representa el ID de tu proyecto de Google Cloud .

  3. Define la asignación de usuarios de PostgreSQL para el servidor de OpenSearch. Ten en cuenta que los FDW de PostgreSQL requieren esta asignación de usuarios para funcionar. AlloyDB se autentica con el encabezado de autorización de REST.

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. Asigna el esquema de tu índice de OpenSearch a una tabla externa de 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'
           );
    

    Reemplaza las siguientes variables nuevas:

    • OPENSEARCH_FD_TABLE: Es el nombre de la tabla de datos externa que representa tu tabla de OpenSearch. Por ejemplo, my-fd-opensearch-table

    • OPENSEARCH_FIELDS: Es una lista separada por comas en la que cada entrada usa el formato opensearch_field_name PG_DATA_TYPE. Para obtener una lista de los tipos de datos de OpenSearch compatibles y sus tipos de PostgreSQL correspondientes, consulta Tipos de datos compatibles.

    • OPENSEARCH_INDEX_NAME: Es el nombre de tu índice de OpenSearch. Por ejemplo, my-opensearch-index

Tipos de datos admitidos

AlloyDB admite los siguientes tipos de datos de OpenSearch:

Tipos de datos Tipo de AlloyDB
alias Tipo de PostgreSQL para el campo al que hace referencia 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

Consulta tus datos de OpenSearch

AlloyDB toma las consultas en SQL y las convierte en consultas de la API de REST de OpenSearch.

Para consultar tus datos de OpenSearch, tienes las siguientes opciones:

  • Consultas de SQL estándar
  • Lenguaje de consultas específico del dominio
  • Búsquedas híbridas

Consultas de SQL estándar

Puedes usar SQL estándar con la sintaxis de Lucene para la expresión de búsqueda.

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

Reemplaza las siguientes variables:

  • OPENSEARCH_FD_TABLE: Es el nombre de la tabla de datos externa que representa tu tabla de OpenSearch. Por ejemplo, my-fd-opensearch-table.

  • (Opcional) FILTER: Es el filtro que se aplicará a tu búsqueda de OpenSearch. Por ejemplo, a = 10 AND b < 105

  • QUERY: Es la búsqueda que se enviará a OpenSearch. Por ejemplo, body:database.

Lenguaje de consultas específico del dominio

Para casos de uso avanzados, usa el lenguaje DSL de consultas de OpenSearch con formato JSON.

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;

Reemplaza OPENSEARCH_FD_TABLE por el nombre de la tabla de datos externa que representa tu tabla de OpenSearch. Por ejemplo, my-fd-opensearch-table

Para realizar una búsqueda híbrida en tus datos de OpenSearch, combina los resultados de la búsqueda de tokens de OpenSearch con los resultados de la búsqueda de vectores de 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;

Reemplaza las siguientes variables:

  • LIMIT: Es la cantidad de resultados que se devolverán. Por ejemplo, 10

  • WEIGHT: Contribución de esta entrada de búsqueda a la fusión de clasificación recíproca (RRF) general. Por ejemplo, 0.5

  • OPENSEARCH_FD_TABLE: Es el nombre de la tabla de datos externa que representa tu tabla de OpenSearch. Por ejemplo, my-fd-opensearch-table

  • QUERY: Es la búsqueda que se enviará a OpenSearch. Por ejemplo, "opensearch_field_name:\"cloud databases\"" busca la frase "bases de datos en la nube" en el campo opensearch_field_name.

Ejemplos de Pushdown

Para que las consultas sean más eficientes, AlloyDB intenta enviar los siguientes aspectos de la consulta directamente a la llamada a la API que se realiza a OpenSearch:

  • SELECT campos
  • WHERE filtros
  • ORDER BY ordena
  • LIMIT

En la siguiente tabla, se incluyen ejemplos de consultas que ilustran qué aspectos AlloyDB puede y no puede enviar.

Tipo de consulta Ejemplo de consulta Elementos de la consulta enviados hacia abajo
Consultas sin filtrar
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT campos
  • ORDER BY ... DESC ordenar
  • LIMIT
Coincidencia de texto exacto
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT campos
  • WHERE filtro
  • LIMIT
Expresiones de campo único
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT campos
  • WHERE filtro
Expresiones constantes
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT campos
  • WHERE filtro
  • LIMIT
Expresiones con funciones
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT campos
Expresiones de varios campos
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT campos
Filtrado de puntuaciones
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT campos
  • ORDER BY ... DESC ordenar
LIKE y operadores similares
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT campos
  • WHERE id > 10 filtro
Consultas sin procesar
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT campos
  • ORDER BY ... DESC ordenar

Soluciona problemas

Si tienes problemas de autenticación o conectividad cuando consultas tu clúster de OpenSearch, verifica las siguientes causas comunes:

  • Errores de autenticación HTTP 401 o 403: Verifica que tu secreto de OpenSearch en Secret Manager contenga una cadena con el formato username:password y que tu cuenta de servicio de AlloyDB tenga el rol de Secret Manager Secret Accessor (roles/secretmanager.secretAccessor).
  • Agota el tiempo de espera de la conexión: Verifica que la conectividad de IP pública saliente esté habilitada en tu instancia principal de AlloyDB y que tu firewall de OpenSearch permita conexiones entrantes en el puerto especificado.

Limitaciones

Antes de conectar AlloyDB a OpenSearch, ten en cuenta las siguientes limitaciones:

  • La integración de OpenSearch solo está disponible en la versión principal 17 de PostgreSQL y versiones posteriores.

  • AlloyDB lee datos de OpenSearch, pero no escribe en ellos.

  • AlloyDB no indexa automáticamente los datos de tu base de datos en OpenSearch. Eres responsable de completar tus índices de OpenSearch y mantener la coherencia entre los datos de AlloyDB y los datos indexados en OpenSearch.

  • AlloyDB no sincroniza automáticamente los esquemas con OpenSearch. Si cambia el esquema de tu índice de OpenSearch, debes actualizar manualmente el esquema de la tabla externa de PostgreSQL correspondiente.

  • No se admiten los tipos de OpenSearch especializados, como geo_point. Para obtener la lista completa de los tipos de datos admitidos, consulta Tipos de datos admitidos.

  • Debes usar la autenticación básica (nombre de usuario y contraseña) configurada en tu clúster de OpenSearch.

¿Qué sigue?