Vous pouvez accéder aux données stockées dans OpenSearch et les rechercher à l'aide de l'intégration de la recherche externe dans AlloyDB. Cette intégration vous permet de joindre des index OpenSearch à des tables relationnelles dans AlloyDB sans déplacer ni copier de données.
Avant de commencer
Avant de commencer, assurez-vous d'avoir effectué les actions suivantes :
Activez la connectivité sortante sur votre instance AlloyDB principale.
Créez et configurez OpenSearch avec un point de terminaison public accessible.
Activez le plug-in de sécurité sur votre cluster OpenSearch et créez un utilisateur en lecture seule dans la base de données des utilisateurs internes. AlloyDB utilise ces identifiants pour accéder à votre cluster OpenSearch.
Stocker les identifiants OpenSearch dans Secret Manager
AlloyDB stocke et lit vos identifiants OpenSearch à partir de Secret Manager. Pour en savoir plus sur l'utilisation de Secret Manager, consultez Créer un secret et y accéder à l'aide de Secret Manager.
Assurez-vous que votre compte de service AlloyDB dispose du rôle Accesseur de secrets Secret Manager (roles/secretmanager.secretAccessor) pour lire le secret dans Secret Manager. Pour en savoir plus, consultez Créer un secret et y accéder à l'aide de Secret Manager.
Activer et configurer l'extension external_search_fdw
Pour commencer votre intégration à OpenSearch, configurez l'accès à votre cluster OpenSearch via un serveur de données externe.
Activez l'extension
external_search_fdw.CREATE EXTENSION external_search_fdw;Créez un serveur pour votre 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' );Remplacez les variables suivantes :
OPENSEARCH_SERVER_NAME: nom de votre serveur de données externes. Exemple :opensearchOPENSEARCH_SERVER_HOST_PORT: URL (point de terminaison) accessible au public pour votre cluster OpenSearch.SECRET_PATH: chemin d'accès Secret Manager à vos identifiants d'authentification OpenSearch. Exemple :projects/123456789012/secrets/opensearch-credentials/versions/1123456789012représente l'ID de votre projet Google Cloud .
Définissez le mappage des utilisateurs PostgreSQL pour le serveur OpenSearch. Notez que les FDW PostgreSQL nécessitent ce mappage utilisateur pour fonctionner. AlloyDB s'authentifie à l'aide de l'en-tête d'autorisation REST.
CREATE USER MAPPING FOR CURRENT_USER SERVER OPENSEARCH_SERVER_NAME;Mappez le schéma de votre index OpenSearch à une table étrangère 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' );Remplacez les nouvelles variables suivantes :
OPENSEARCH_FD_TABLE: nom de la table de données externe qui représente votre table OpenSearch. Exemple :my-fd-opensearch-tableOPENSEARCH_FIELDS: liste séparée par des virgules où chaque entrée utilise le formatopensearch_field_name PG_DATA_TYPE. Pour obtenir la liste des types de données OpenSearch compatibles et de leurs types PostgreSQL correspondants, consultez Types de données compatibles.OPENSEARCH_INDEX_NAME: nom de votre index OpenSearch. Exemple :my-opensearch-index
Types de données acceptés
AlloyDB est compatible avec les types de données OpenSearch suivants :
| Type(s) de données | Type AlloyDB |
|---|---|
alias
|
Type PostgreSQL du champ auquel alias fait référence
|
binary
|
bytea
|
boolean
|
BOOLEAN
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
Interroger vos données OpenSearch
AlloyDB prend les requêtes SQL et les convertit en requêtes d'API REST OpenSearch.
Pour interroger vos données OpenSearch, vous disposez des options suivantes :
- Requêtes en SQL standard
- DSL de requête
- Recherches hybrides
Requêtes en SQL standard
Vous pouvez utiliser le langage SQL standard avec la syntaxe Lucene pour l'expression de recherche.
SELECT id, body
FROM OPENSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';
Remplacez les variables suivantes :
OPENSEARCH_FD_TABLE: nom de la table de données externe qui représente votre table OpenSearch. Exemple :my-fd-opensearch-table.(Facultatif)
FILTER: filtre à appliquer à votre requête OpenSearch. Exemple :a = 10 AND b < 105QUERY: requête à envoyer à OpenSearch. Exemple :body:database.
DSL de requête
Pour les cas d'utilisation avancés, utilisez le DSL de requête de style JSON 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;
Remplacez OPENSEARCH_FD_TABLE par le nom de la table de données externe qui représente votre table OpenSearch. Exemple :my-fd-opensearch-table
Recherches hybrides
Pour effectuer une recherche hybride sur vos données OpenSearch, combinez les résultats de la recherche de jetons OpenSearch avec les résultats de la recherche vectorielle 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;
Remplacez les variables suivantes :
LIMIT: nombre de résultats à renvoyer. Exemple :10WEIGHT: contribution de cette entrée de recherche à la Reciprocal Rank Fusion (RRF) globale. Exemple :0.5OPENSEARCH_FD_TABLE: nom de la table de données externe qui représente votre table OpenSearch. Exemple :my-fd-opensearch-tableQUERY: requête à envoyer à OpenSearch. Par exemple,"opensearch_field_name:\"cloud databases\""recherche l'expression "bases de données cloud" dans le champopensearch_field_name.
Exemples de pushdown
Pour rendre les requêtes plus efficaces, AlloyDB tente de transmettre les aspects suivants de la requête directement à l'appel d'API effectué vers OpenSearch :
SELECTchampsWHEREfiltresORDER BYtrisLIMIT
Pour obtenir des exemples de requêtes illustrant les aspects qu'AlloyDB peut ou ne peut pas transférer, consultez le tableau suivant.
| Type de requête | Exemple de requête | Éléments de requête déplacés vers le bas |
|---|---|---|
| Requêtes non filtrées |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| Correspondance exacte avec le texte |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| Expressions à champ unique |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| Expressions constantes |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| Expressions avec des fonctions |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| Expressions multifield |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| Filtrage des scores |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE et opérateurs similaires |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| Requêtes brutes |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
Dépannage
Si vous rencontrez des problèmes d'authentification ou de connectivité lorsque vous interrogez votre cluster OpenSearch, vérifiez les causes courantes suivantes :
- Erreurs d'authentification HTTP 401 ou 403 : vérifiez que votre secret OpenSearch dans Secret Manager contient une chaîne au format
username:passwordet que votre compte de service AlloyDB dispose du rôle Accesseur de secrets Secret Manager (roles/secretmanager.secretAccessor). - Délai de connexion dépassé : vérifiez que la connectivité IP publique sortante est activée sur votre instance AlloyDB principale et que votre pare-feu OpenSearch autorise les connexions entrantes sur le port spécifié.
Limites
Avant de connecter AlloyDB à OpenSearch, prenez connaissance des limites suivantes :
L'intégration OpenSearch n'est disponible que sur la version majeure
17de PostgreSQL et les versions ultérieures.AlloyDB lit les données OpenSearch, mais ne les écrit pas.
AlloyDB n'indexe pas automatiquement les données de votre base de données dans OpenSearch. Vous êtes responsable du remplissage de vos index OpenSearch et du maintien de la cohérence entre les données d'AlloyDB et les données indexées dans OpenSearch.
AlloyDB ne synchronise pas automatiquement les schémas avec OpenSearch. Si le schéma de votre index OpenSearch change, vous devez mettre à jour manuellement le schéma de la table externe PostgreSQL correspondante.
Les types OpenSearch spécialisés, tels que
geo_point, ne sont pas acceptés. Pour obtenir la liste complète des types de données acceptés, consultez Types de données acceptés.Vous devez utiliser l'authentification de base (nom d'utilisateur et mot de passe) configurée dans votre cluster OpenSearch.
Étapes suivantes
- Découvrez comment accéder aux données Elasticsearch.
- Découvrez comment accéder aux données Solr.
- Découvrez comment exécuter une recherche hybride de similarité vectorielle.