Auf OpenSearch-Daten über AlloyDB zugreifen

Mit der Integration der externen Suche in AlloyDB können Sie auf in OpenSearch gespeicherte Daten zugreifen und diese durchsuchen. Mit dieser Integration können Sie OpenSearch-Indexe mit relationalen Tabellen in AlloyDB verknüpfen, ohne Daten verschieben oder kopieren zu müssen.

Hinweis

Bevor Sie beginnen, müssen Sie Folgendes tun:

OpenSearch-Anmeldedaten in Secret Manager speichern

AlloyDB speichert und liest Ihre OpenSearch-Anmeldedaten aus Secret Manager. Weitere Informationen zur Verwendung von Secret Manager finden Sie unter Secret mit Secret Manager erstellen und darauf zugreifen.

Achten Sie darauf, dass Ihr AlloyDB-Dienstkonto die Rolle „Secret Manager Secret Accessor“ (roles/secretmanager.secretAccessor) hat, um das Secret aus Secret Manager zu lesen. Weitere Informationen finden Sie unter Secret mit Secret Manager erstellen und darauf zugreifen.

external_search_fdw-Erweiterung aktivieren und konfigurieren

Konfigurieren Sie für die Einbindung von OpenSearch den Zugriff auf Ihren OpenSearch-Cluster über einen externen Datenserver.

  1. Aktivieren Sie die Erweiterung external_search_fdw.

    CREATE EXTENSION external_search_fdw;
    
  2. Erstellen Sie einen Server für Ihren OpenSearch-Cluster.

    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'
    );
    

    Ersetzen Sie die folgenden Variablen:

    • OPENSEARCH_SERVER_NAME: Name für Ihren externen Datenserver. Beispiel: opensearch.

    • OPENSEARCH_SERVER_HOST_PORT: öffentliche URL (Endpunkt) für Ihren OpenSearch-Cluster.

    • SECRET_PATH: Secret Manager-Pfad zu Ihren OpenSearch-Authentifizierungsdaten. Beispiel: projects/123456789012/secrets/opensearch-credentials/versions/1. 123456789012 ist Ihre Google Cloud -Projekt-ID.

  3. Definieren Sie die PostgreSQL-Nutzerzuordnung für den OpenSearch-Server. Beachten Sie, dass PostgreSQL-FDWs diese Nutzerzuordnung benötigen, um zu funktionieren. AlloyDB authentifiziert sich über den REST-Autorisierungsheader.

    CREATE USER MAPPING FOR CURRENT_USER
    SERVER OPENSEARCH_SERVER_NAME;
    
  4. Ordnen Sie das Schema Ihres OpenSearch-Index einer externen PostgreSQL-Tabelle zu.

    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'
           );
    

    Ersetzen Sie die folgenden neuen Variablen:

    • OPENSEARCH_FD_TABLE: der Name der externen Datentabelle, die Ihre OpenSearch-Tabelle darstellt. Beispiel: my-fd-opensearch-table.

    • OPENSEARCH_FIELDS: eine durch Kommas getrennte Liste, in der jeder Eintrag das Format opensearch_field_name PG_DATA_TYPE hat. Eine Liste der unterstützten OpenSearch-Datentypen und der entsprechenden PostgreSQL-Typen finden Sie unter Unterstützte Datentypen.

    • OPENSEARCH_INDEX_NAME: der Name Ihres OpenSearch-Index. Beispiel: my-opensearch-index.

Unterstützte Datentypen

AlloyDB unterstützt die folgenden OpenSearch-Datentypen:

Datentyp(en) AlloyDB-Typ
alias PostgreSQL-Typ für das Feld, auf das alias verweist
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

OpenSearch-Daten abfragen

AlloyDB wandelt SQL-Abfragen in OpenSearch REST API-Abfragen um.

Für die Abfrage Ihrer OpenSearch-Daten haben Sie folgende Möglichkeiten:

  • Standard-SQL-Abfragen
  • Abfrage-DSL
  • Hybridsuchen

Standard-SQL-Abfragen

Sie können Standard-SQL mit Lucene-Syntax für den Suchausdruck verwenden.

SELECT id, body
FROM OPENSEARCH_FD_TABLE
WHERE FILTER
ORDER BY metadata <@> 'QUERY';

Ersetzen Sie die folgenden Variablen:

  • OPENSEARCH_FD_TABLE: Der Name der externen Datentabelle, die Ihre OpenSearch-Tabelle darstellt. Beispiel: my-fd-opensearch-table

  • (Optional) FILTER: Der Filter, der auf Ihre OpenSearch-Abfrage angewendet werden soll. Beispiel: a = 10 AND b < 105.

  • QUERY: Die Abfrage, die an OpenSearch gesendet werden soll. Beispiel: body:database

Abfrage-DSL

Für erweiterte Anwendungsfälle können Sie die OpenSearch-JSON-Abfrage-DSL verwenden.

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;

Ersetzen Sie OPENSEARCH_FD_TABLE durch den Namen der externen Datentabelle, die Ihre OpenSearch-Tabelle darstellt. Beispiel: my-fd-opensearch-table.

Wenn Sie eine hybride Suche in Ihren OpenSearch-Daten durchführen möchten, verknüpfen Sie die OpenSearch-Token-Suchergebnisse mit den AlloyDB-Vektorsuchergebnissen.

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;

Ersetzen Sie die folgenden Variablen:

  • LIMIT: Anzahl der zurückzugebenden Ergebnisse. Beispiel: 10.

  • WEIGHT: Beitrag dieses Sucheintrags zur gesamten Reciprocal Rank Fusion (RRF). Beispiel: 0.5.

  • OPENSEARCH_FD_TABLE: Name der externen Datentabelle, die Ihre OpenSearch-Tabelle darstellt. Beispiel: my-fd-opensearch-table.

  • QUERY: Abfrage, die an OpenSearch gesendet werden soll. Beispiel: Mit "opensearch_field_name:\"cloud databases\"" wird im Feld opensearch_field_name nach dem Ausdruck „cloud databases“ gesucht.

Pushdown-Beispiele

Um Abfragen effizienter zu gestalten, versucht AlloyDB, die folgenden Aspekte der Abfrage direkt in den API-Aufruf an OpenSearch zu übertragen:

  • SELECT Felder
  • WHERE Filter
  • ORDER BY Sortierung
  • LIMIT

In der folgenden Tabelle finden Sie Beispielabfragen, die zeigen, welche Aspekte AlloyDB per Push übertragen kann und welche nicht.

Abfragetyp Beispielabfrage Abfrageelemente per Push übertragen
Ungefilterte Abfragen
SELECT id, body
FROM opensearch_table
ORDER BY metadata <@> 'body:foo' DESC
LIMIT 10;
  • SELECT Felder
  • ORDER BY ... DESC Sortierung
  • LIMIT
Genaue Textübereinstimmung
SELECT id, body
FROM opensearch_table
WHERE body = 'foo'
LIMIT 10;
  • SELECT Felder
  • WHERE Filter
  • LIMIT
Einzelfeldausdrücke
SELECT id, body
FROM opensearch_table
WHERE id > 10
ORDER BY metadata <@> 'body:foo'
LIMIT 10;
  • SELECT Felder
  • WHERE Filter
Konstante Ausdrücke
SELECT id, body
FROM opensearch_table
WHERE id > (1+1)
LIMIT 10;
  • SELECT Felder
  • WHERE Filter
  • LIMIT
Ausdrücke mit Funktionen
SELECT id, body
FROM opensearch_table
WHERE id > CEIL(3.14)
LIMIT 10;
  • SELECT Felder
Ausdrücke mit mehreren Feldern
SELECT id, body
FROM opensearch_table
WHERE dbl_field < flt_field
LIMIT 10;
  • SELECT Felder
Score-Filterung
SELECT id, body, (metadata <@> 'body:bar') AS score
FROM opensearch_table
WHERE score > 0.5
ORDER by score desc
LIMIT 10;
  • SELECT Felder
  • ORDER BY ... DESC Sortierung
LIKE und ähnliche Operatoren
SELECT id, body
FROM opensearch_table
WHERE id > 10 AND body LIKE '%foo%'
LIMIT 10;
  • SELECT Felder
  • WHERE id > 10 Filter
Unbearbeitete Abfragen
SELECT id, body
FROM opensearch_table
WHERE id < 10
ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC
LIMIT 10;
  • SELECT Felder
  • ORDER BY ... DESC Sortierung

Fehlerbehebung

Wenn beim Abfragen Ihres OpenSearch-Clusters Authentifizierungs- oder Verbindungsprobleme auftreten, prüfen Sie die folgenden häufigen Ursachen:

  • HTTP-Authentifizierungsfehler 401 oder 403: Prüfen Sie, ob Ihr OpenSearch-Secret in Secret Manager einen String im Format username:password enthält und ob Ihr AlloyDB-Dienstkonto die Rolle „Secret Manager Secret Accessor“ (roles/secretmanager.secretAccessor) hat.
  • Verbindungszeitüberschreitungen: Prüfen Sie, ob die ausgehende öffentliche IP-Verbindung auf Ihrer primären AlloyDB-Instanz aktiviert ist und ob Ihre OpenSearch-Firewall eingehende Verbindungen über den angegebenen Port zulässt.

Beschränkungen

Bevor Sie AlloyDB mit OpenSearch verbinden, sollten Sie die folgenden Einschränkungen beachten:

  • Die OpenSearch-Integration ist nur für PostgreSQL-Hauptversionen ab 17 verfügbar.

  • AlloyDB liest OpenSearch-Daten, schreibt aber nicht in diese.

  • AlloyDB indexiert Ihre Datenbankdaten nicht automatisch in OpenSearch. Sie sind dafür verantwortlich, Ihre OpenSearch-Indizes zu füllen und die Konsistenz zwischen den Daten in AlloyDB und den indexierten Daten in OpenSearch zu wahren.

  • AlloyDB synchronisiert Schemas nicht automatisch mit OpenSearch. Wenn sich das OpenSearch-Indexschema ändert, müssen Sie das Schema der entsprechenden PostgreSQL-Fremdtabelle manuell aktualisieren.

  • Spezielle OpenSearch-Typen wie geo_point werden nicht unterstützt. Eine vollständige Liste der unterstützten Datentypen finden Sie unter Unterstützte Datentypen.

  • Sie müssen die Basisauthentifizierung (Nutzername und Passwort) verwenden, die in Ihrem OpenSearch-Cluster konfiguriert ist.

Nächste Schritte