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 |