Accéder aux données OpenSearch depuis AlloyDB

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 opérations suivantes :

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 d'accesseur de secrets Secret Manager (roles/secretmanager.secretAccessor) pour lire le secret depuis 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 l'intégration avec OpenSearch, configurez l'accès à votre cluster OpenSearch via un serveur de données externe.

  1. Activez l'extension external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. 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 externe. Exemple :opensearch

    • OPENSEARCH_SERVER_HOST_PORT : URL publique (point de terminaison) de votre cluster OpenSearch.

    • SECRET_PATH : chemin d'accès Secret Manager à vos identifiants d'authentification OpenSearch. Exemple :projects/123456789012/secrets/opensearch-credentials/versions/1 123456789012 représente l'ID de votre projet Google Cloud .

  3. Définissez le mappage des utilisateurs PostgreSQL pour le serveur OpenSearch. Notez que les FDW PostgreSQL nécessitent ce mappage d'utilisateurs 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;
    
  4. Mappez le schéma de votre index OpenSearch à une table externe 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 étrangère qui représente votre table OpenSearch. Exemple :my-fd-opensearch-table

    • OPENSEARCH_FIELDS : liste d'éléments séparés par une virgule, où chaque entrée utilise le format opensearch_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 pour le champ auquel alias fait référence
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

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 SQL standards
  • DSL de requête
  • Recherches hybrides

Requêtes SQL standards

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 < 105

  • QUERY : 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

Pour effectuer une recherche hybride sur vos données OpenSearch, joignez les résultats de recherche de jetons OpenSearch aux résultats de 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 :10

  • WEIGHT : contribution de cette entrée de recherche à la Reciprocal Rank Fusion (RRF) globale. Exemple :0.5

  • OPENSEARCH_FD_TABLE : nom de la table de données étrangère qui représente votre table OpenSearch. Exemple :my-fd-opensearch-table

  • QUERY : requête à envoyer à OpenSearch. Par exemple, "opensearch_field_name:\"cloud databases\"" recherche l'expression "cloud databases" dans le champ opensearch_field_name.

Exemples de pushdown

Pour rendre les requêtes plus efficaces, AlloyDB tente de transférer les aspects suivants de la requête directement dans l'appel d'API effectué vers OpenSearch :

  • SELECT champs
  • WHERE filtres
  • ORDER BY tri
  • LIMIT

Pour obtenir des exemples de requêtes illustrant les aspects qu'AlloyDB peut et ne peut pas transférer, consultez le tableau suivant.

Type de requête Exemple de requête Éléments de requête transférés
Requêtes non filtrées
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT champs
  • ORDER BY ... DESC tri
  • LIMIT
Correspondance exacte avec le texte
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT champs
  • WHERE filtre
  • LIMIT
Expressions à champ unique
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT champs
  • WHERE filtre
Expressions constantes
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT champs
  • WHERE filtre
  • LIMIT
Expressions avec des fonctions
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT champs
Expressions multichamps
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT champs
Filtrage des scores
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT champs
  • ORDER BY ... DESC tri
LIKE et opérateurs similaires
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT champs
  • WHERE id > 10 filtre
Requêtes brutes
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT champs
  • ORDER BY ... DESC tri

Dépannage

Si vous rencontrez des problèmes d'authentification ou de connectivité lors de l'interrogation de 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:password et que votre compte de service AlloyDB dispose du rôle "Accesseur de secrets Secret Manager" (roles/secretmanager.secretAccessor).
  • Délais avant expiration de la connexion : 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, tenez compte des limites suivantes :

  • L'intégration d'OpenSearch n'est disponible que sur la version majeure 17 de PostgreSQL et les versions ultérieures.

  • AlloyDB lit les données OpenSearch, mais n'y écrit pas.

  • AlloyDB n'indexe pas automatiquement les données de votre base de données dans OpenSearch. Vous êtes responsable de l'alimentation 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