Puedes acceder a los datos almacenados en Elasticsearch y buscarlos creando un wrapper de datos externos (FDW) y una tabla externa en AlloyDB Omni.
Antes de comenzar
Antes de comenzar, completa lo siguiente:
- Instala AlloyDB Omni con contenedores.
- Implementa y ejecuta Elasticsearch en producción.
- Crea una clave de API de usuario/personal de solo lectura que AlloyDB Omni pueda usar para acceder a tu clúster de Elasticsearch.
Crea una cuenta de servicio
AlloyDB Omni requiere una cuenta de servicio con Google Cloud para autenticar y usar Secret Manager. AlloyDB Omni usa Secret Manager para almacenar tu clave de API de Elasticsearch.
Si aún no creaste una cuenta de servicio para AlloyDB Omni, crea una siguiendo estos pasos:
Crea una cuenta de servicio con Google Cloud. Otorgas permisos a esta cuenta de servicio para acceder a Secret Manager en Configura AlloyDB AI.
Crea una clave de cuenta de servicio y guárdala en formato JSON en el archivo
private-key.json. Luego, descárgala.Copia la clave de la cuenta de servicio que creaste en
KEY_PATH. La ruta de acceso de la clave debe ser una ruta de acceso en tu host a la que pueda acceder el usuario que ejecuta tu contenedor de AlloyDB Omni y que sea de su propiedad.
Almacena la clave de API de Elasticsearch en Secret Manager
AlloyDB Omni almacena y lee tu clave de API de Elasticsearch 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 otorgar permiso a tu cuenta de servicio de AlloyDB Omni para leer el Secret. Para obtener más información, consulta Administra el acceso a los secretos.
Configura AlloyDB AI para AlloyDB Omni
Para configurar AlloyDB AI para AlloyDB Omni, consulta Configura AlloyDB AI para AlloyDB Omni y omite el primer paso.
Habilita y configura la extensión external_search_fdw
Para comenzar la integración en Elasticsearch, completa las siguientes
instrucciones para habilitar y configurar la
extensión external_search_fdw
de AlloyDB Omni:
Habilita la extensión
external_search_fdw.CREATE EXTENSION external_search_fdw;Configura el acceso a tu clúster de Elasticsearch a través de un servidor de datos externo.
CREATE SERVER ELASTICSEARCH_SERVER_NAME FOREIGN DATA WRAPPER external_search_fdw OPTIONS (server 'ELASTICSEARCH_SERVER_HOST_PORT', search_provider 'elastic', auth_mode 'secret_manager', auth_method 'AUTH_METHOD', secret_path 'SECRET_PATH', max_deadline_ms 'MAX_DEADLINE', pagination_num_results 'PAGINATION_NUM_RESULTS', pagination_context_timeout_ms 'PAGINATION_CONTEXT_TIMEOUT');Reemplaza las siguientes variables:
ELASTICSEARCH_SERVER_NAME: Es el nombre de tu servidor de datos externo. Por ejemplo,my-elasticsearch-server.ELASTICSEARCH_SERVER_HOST_PORT: Es la URL pública de tu clúster de Elasticsearch. Por ejemplo,https://node1.elastic.test.com:9200.AUTH_METHOD: Es el tipo de autenticación que se usará. Puedes elegir entre las siguientes opciones:ApiKey: Es la clave de API de Elasticsearch personal o de usuario.Basic: Es el nombre de usuario y la contraseña de Elasticsearch.
SECRET_PATH: Es la ruta de acceso de Secret Manager a tus credenciales de autenticación de Elasticsearch. Por ejemplo,projects/123456789012/secrets/apikey/versions/1.123456789012representa el ID del proyecto de Google Cloud .MAX_DEADLINE(opcional): es la cantidad máxima de tiempo, en milisegundos, que AlloyDB Omni espera una respuesta de Elasticsearch. Establece este valor según las ubicaciones de tus instancias de AlloyDB Omni y Elasticsearch. El valor predeterminado es10000.PAGINATION_NUM_RESULTS(opcional): Es la cantidad máxima de resultados que se recuperan por lote de Elasticsearch. Si se solicitan más resultados, AlloyDB Omni los recupera en varios lotes de este tamaño. El valor predeterminado es32.PAGINATION_CONTEXT_TIMEOUT(opcional): Es la cantidad de tiempo, en milisegundos, que Elasticsearch mantiene activo el contexto de la solicitud de paginación. El valor predeterminado es30000.
Define la asignación de usuarios de PostgreSQL para el servidor de Elasticsearch. Ten en cuenta que los FDW de PostgreSQL requieren esta asignación de usuarios para funcionar. AlloyDB Omni se autentica con el encabezado de autorización de REST.
CREATE USER MAPPING FOR CURRENT_USER SERVER ELASTICSEARCH_SERVER_NAME;Configura el esquema para tus datos de Elasticsearch a través de una tabla de datos externa.
CREATE FOREIGN TABLE ELASTICSEARCH_FD_TABLE( metadata external_search_fdw_schema.OpaqueMetadata, ELASTICSEARCH_FIELDS) SERVER ELASTICSEARCH_SERVER_NAME OPTIONS(remote_table_name 'ELASTICSEARCH_INDEX_NAME');Reemplaza las siguientes variables nuevas:
ELASTICSEARCH_FD_TABLE: es el nombre de la tabla de datos externa que representa tu tabla de Elasticsearch. Por ejemplo,my-fd-elasticsearch-tableELASTICSEARCH_FIELDS: es una lista separada por comas de definiciones de esquemas de campos de Elasticsearch en el siguiente formato:elasticsearch_field_name PG_DATA_TYPE. Por ejemplo,elasticsearch_boolean_field_name BOOLEAN, elasticsearch_double_field_name DOUBLE PRECISION. Estos campos deben coincidir con los nombres de los campos en Elasticsearch, a menos que se agregue la opciónremote_field_name. Por ejemplo:elasticsearch_foo OPTIONS (remote_field_name 'elasticsearch_FOO').Para obtener la lista de tipos de datos de Elasticsearch que se pueden definir para AlloyDB Omni, consulta Tipos de datos compatibles.
ELASTICSEARCH_INDEX_NAME: es el nombre de tu índice de Elasticsearch. Por ejemplo,my-elasticsearch-index
Tipos de datos admitidos
AlloyDB Omni admite los siguientes tipos de datos de Elasticsearch:
| Tipos de datos | Tipo de PostgreSQL |
|---|---|
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 Elasticsearch
AlloyDB Omni toma las consultas en SQL y las convierte en
consultas de la API de REST de Elasticsearch. Durante esta conversión,
AlloyDB Omni intenta enviar la mayor cantidad posible de lógica de consulta
sin cambiar la identidad de la consulta, incluida la LIMIT de la consulta en SQL. Sin embargo, hay casos en los que puedes especificar que no se envíen
ciertos campos de Elasticsearch o en los que no se puede enviar la lógica de consulta. Por
ejemplo, LIKE y
otros operadores de coincidencia de texto no se pueden enviar hacia abajo. Para ver más ejemplos de lo que
se puede y no se puede enviar, consulta Ejemplos de envío.
En situaciones en las que el LIMIT se establece en un valor superior a pagination_num_results o
en las que no se especifica LIMIT o no se puede enviar,
AlloyDB Omni usa la
API de Scroll,
que puede consumir muchos recursos.
Debido a que la API de Scroll puede consumir muchos recursos, te recomendamos que examines tus
consultas con EXPLAIN VERBOSE para ver qué APIs se usan. Limitar el uso de la API de Scroll y usar LIMIT mejora el rendimiento.
Para consultar tus datos de Elasticsearch, tienes las siguientes opciones:
- Consultas en SQL estándar
- DSL de consulta
- Búsquedas híbridas
Consultas en SQL estándar
Las consultas en SQL estándar se pueden escribir con la sintaxis de Lucene de Elasticsearch.
Para realizar una consulta en SQL estándar, consulta el siguiente ejemplo:
SELECT id, body
FROM ELASTICSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';
Reemplaza las siguientes variables:
ELASTICSEARCH_FD_TABLE: es el nombre de la tabla de datos externa que representa tu tabla de Elasticsearch. Por ejemplo,my-fd-elasticsearch-table.FILTER(opcional): Es el filtro que se aplicará a tu consulta de Elasticsearch. Por ejemplo,AND qubits < 105QUERY: Es la consulta que se enviará a Elasticsearch. Para ver algunas consultas de ejemplo, consulta la siguiente lista:body:quantum body:computingbody:(quantum computing)body:(quantum AND computing)body:"quantum computing"body:"quantum computing" AND qubits:[* TO 105}
DSL de consulta
DSL de consulta es el lenguaje de consulta con estilo JSON y con todas las funciones de Elasticsearch, recomendado para casos de uso avanzados. El DSL de consulta te permite realizar búsquedas, filtrados y agregaciones complejos que no se pueden expresar en la sintaxis de consulta en SQL.
Para realizar consultas con DSL de consulta, consulta el siguiente ejemplo:
SELECT id, body
FROM ELASTICSEARCH_FD_TABLE
ORDER BY
metadata <@> $${
"query": {
"bool": {
"must": [
{
"query_string": {
"query" : "QUERY"
}
}
],
"filter": [
{
"range": {
"id": {
"lt": "10"
}
}
}
]
}
},
"sort": [
{
"id": {
"order": "desc"
}
}
]
}$$
LIMIT 1;
Reemplaza las siguientes variables:
ELASTICSEARCH_FD_TABLE: es el nombre de la tabla de datos externa que representa tu tabla de Elasticsearch. Por ejemplo,my-fd-elasticsearch-table.QUERY: Es la consulta que se enviará a Elasticsearch. Por ejemplo,"elasticsearch_field_name:\"quantum computing\" OR int_field:[* TO 3]".
Ten en cuenta que, para el DSL de consulta, solo se espera que propagues las expresiones query, filter y sort.
Búsquedas híbridas
Para realizar una búsqueda híbrida en tus datos de Elasticsearch, consulta el siguiente ejemplo de búsqueda:
SELECT *
FROM
ai.hybrid_search(
ARRAY[
'{"limit": LIMIT,
"data_type": "external_search_fdw",
"weight": WEIGHT,
"table_name": "ELASTICSEARCH_FD_TABLE",
"key_column": "DOCUMENT_ID_COLUMN_NAME",
"query_text_input": QUERY}'::jsonb],
NULL::TEXT,
'RRF',
FALSE)
ORDER BY score DESC;
Reemplaza las siguientes variables:
LIMIT: Es la cantidad de resultados que se devolverán. Por ejemplo,3WEIGHT: Es la contribución de esta entrada de búsqueda a la fusión por clasificación recíproca (RRF) general. Por ejemplo,0.5. Si no proporcionas pesos, se distribuyen de manera uniforme. Para obtener más información, consulta Parámetros de la función de búsqueda híbrida.ELASTICSEARCH_FD_TABLE: es el nombre de la tabla de datos externa que representa tu tabla de Elasticsearch. Por ejemplo,my-fd-elasticsearch-table.DOCUMENT_ID_COLUMN_NAME: Es el nombre de la columna de ID del documento.QUERY: Es la consulta que se enviará a Elasticsearch. Por ejemplo,"elasticsearch_field_name:\"quantum computing\""busca la frase "computación cuántica" en el campoelasticsearch_field_name. Todos los tipos de consultas mencionados en Tipos de datos admitidos se pueden usar en tu consulta.
Para obtener más información sobre los parámetros disponibles para las búsquedas híbridas, consulta Parámetros de la función de búsqueda híbrida.
Ejemplos de anuncios pushdown
Para que las consultas sean más eficientes, AlloyDB Omni intenta enviar los siguientes aspectos de la consulta directamente a la llamada a la API realizada a Elasticsearch:
SELECTcamposWHEREfiltrosORDER BYordenamientoLIMIT
Para ver ejemplos de consultas que muestran qué aspectos AlloyDB Omni puede y no puede enviar, consulta la siguiente tabla.
| Tipo de consulta | Ejemplo de consulta | Elementos de consulta enviados |
|---|---|---|
| Consultas sin filtrar |
SELECT id, body FROM elasticsearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| Coincidencia exacta de texto |
SELECT id, body FROM elasticsearch_table WHERE body = 'foo' LIMIT 10; |
|
| Expresiones de campo único |
SELECT id, body FROM elasticsearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| Expresiones constantes |
SELECT id, body FROM elasticsearch_table WHERE id > (1+1) LIMIT 10; |
|
| Expresiones con funciones |
SELECT id, body FROM elasticsearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| Expresiones de varios campos |
SELECT id, body FROM elasticsearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| Filtrado de puntuaciones |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM elasticsearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE y operadores similares |
SELECT id, body FROM elasticsearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| Consultas sin procesar |
SELECT id, body FROM elasticsearch_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 Elasticsearch, verifica lo siguiente:
- Errores de autenticación HTTP 401 o 403: Verifica que tu secreto de Elasticsearch
en Secret Manager contenga credenciales de autenticación válidas
para tu
auth_method(ApiKeyoBasic) y verifica que tu cuenta de servicio tenga el permisosecretmanager.secretAccessor. - Tiempos de espera de conexión: Verifica las reglas de red y la configuración del firewall entre AlloyDB Omni y tu extremo de Elasticsearch.
Limitaciones
AlloyDB Omni lee, pero no escribe, datos de Elasticsearch.
Eres responsable de sincronizar los datos entre AlloyDB Omni y Elasticsearch.
No se admiten los tipos especializados de Elasticsearch, como
geo_point. Para obtener más información, consulta Tipos de datos compatibles.
¿Qué sigue?
- Obtén más información para acceder a los datos de OpenSearch.
- Obtén más información para acceder a los datos de Solr.
- Aprende a ejecutar una búsqueda híbrida de similitud de vectores.