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:
Habilita la conectividad saliente en tu instancia principal de AlloyDB.
Crea y configura OpenSearch con un extremo público accesible.
Habilita el complemento de seguridad en tu clúster de OpenSearch y crea un usuario con acceso de lectura en la base de datos de usuarios internos. AlloyDB usa estas credenciales para acceder a tu clúster de OpenSearch.
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.
Habilita la extensión
external_search_fdw.CREATE EXTENSION external_search_fdw;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,opensearchOPENSEARCH_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/1123456789012representa el ID de tu proyecto de Google Cloud .
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;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-tableOPENSEARCH_FIELDS: Es una lista separada por comas en la que cada entrada usa el formatoopensearch_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
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
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 < 105QUERY: 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
Búsquedas híbridas
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,10WEIGHT: Contribución de esta entrada de búsqueda a la fusión de clasificación recíproca (RRF) general. Por ejemplo,0.5OPENSEARCH_FD_TABLE: Es el nombre de la tabla de datos externa que representa tu tabla de OpenSearch. Por ejemplo,my-fd-opensearch-tableQUERY: 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 campoopensearch_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:
SELECTcamposWHEREfiltrosORDER BYordenaLIMIT
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; |
|
| Coincidencia de texto exacto |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| Expresiones de campo único |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| Expresiones constantes |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| Expresiones con funciones |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| Expresiones de varios campos |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| Filtrado de puntuaciones |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE y operadores similares |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| Consultas sin procesar |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
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:passwordy 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
17de 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?
- Obtén más información para acceder a los datos de Elasticsearch.
- Obtén más información para acceder a los datos de Solr.
- Obtén información para ejecutar una búsqueda híbrida de similitud de vectores.