Sie können mit der Integration der externen Suche in AlloyDB auf Daten zugreifen, die in OpenSearch gespeichert sind, und darin suchen. Mit dieser Integration können Sie OpenSearch-Indizes mit relationalen Tabellen in AlloyDB verknüpfen, ohne Daten verschieben oder kopieren zu müssen.
Hinweis
Bevor Sie beginnen, müssen Sie Folgendes erledigt haben:
Aktivieren Sie ausgehende Verbindungen für Ihre primäre AlloyDB-Instanz.
OpenSearch erstellen und konfigurieren mit einem zugänglichen öffentlichen Endpunkt.
Aktivieren Sie das Sicherheits-Plug-in in Ihrem OpenSearch-Cluster und erstellen Sie einen Nutzer mit Lesezugriff in der internen Nutzerdatenbank. AlloyDB verwendet diese Anmeldedaten für den Zugriff auf Ihren OpenSearch-Cluster.
OpenSearch-Anmeldedaten in Secret Manager speichern
AlloyDB speichert Ihre OpenSearch-Anmeldedaten in Secret Manager und liest sie daraus. Weitere Informationen zur Verwendung von Secret Manager finden Sie unter Secret mit Secret Manager erstellen und darauf zugreifen.
Prüfen Sie, ob 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
Um die Integration mit OpenSearch zu starten, konfigurieren Sie den Zugriff auf Ihren OpenSearch-Cluster über einen ausländischen Datenserver.
Aktivieren Sie die Erweiterung
external_search_fdw.CREATE EXTENSION external_search_fdw;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 Server für externe Daten. Beispiel:opensearch.OPENSEARCH_SERVER_HOST_PORT: Die öffentliche URL (Endpunkt) für Ihren OpenSearch-Cluster.SECRET_PATH: Secret Manager-Pfad zu Ihren OpenSearch-Anmeldedaten. Beispiel:projects/123456789012/secrets/opensearch-credentials/versions/1.123456789012steht für Ihre Google Cloud -Projekt-ID.
Definieren Sie die PostgreSQL-Nutzerzuordnung für den OpenSearch-Server. Hinweis: Für PostgreSQL-FDWs ist diese Nutzerzuordnung erforderlich. Die Authentifizierung in AlloyDB erfolgt über den REST-Autorisierungsheader.
CREATE USER MAPPING FOR CURRENT_USER SERVER OPENSEARCH_SERVER_NAME;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 Formatopensearch_field_name PG_DATA_TYPEverwendet. 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
|
|
|
SMALLINT
|
date
|
TIMESTAMPTZ
|
DOUBLE PRECISION
|
|
REAL
|
|
integer
|
INTEGER
|
long
|
BIGINT
|
jsonb
|
|
|
|
TEXT
|
unsigned_long
|
NUMERIC
|
OpenSearch-Daten abfragen
AlloyDB nimmt SQL-Abfragen entgegen und wandelt sie 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-Anfrage angewendet werden soll. Beispiel:a = 10 AND b < 105.QUERY: Die Anfrage, die an OpenSearch gesendet werden soll. Beispiel:body:database
Abfrage-DSL
Für erweiterte Anwendungsfälle können Sie die OpenSearch-Abfragesprache (Query DSL) im JSON-Stil 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.
Hybridsuchen
Wenn Sie eine hybride Suche in Ihren OpenSearch-Daten ausführen möchten, müssen Sie die Ergebnisse der OpenSearch-Tokensuche mit den Ergebnissen der AlloyDB-Vektorsuche zusammenführen.
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: Die an OpenSearch zu sendende Anfrage. Mit"opensearch_field_name:\"cloud databases\""wird beispielsweise im Feldopensearch_field_namenach dem Begriff „Cloud-Datenbanken“ gesucht.
Beispiele für Pushdown
Um Abfragen effizienter zu gestalten, versucht AlloyDB, die folgenden Aspekte der Abfrage direkt in den API-Aufruf an OpenSearch zu übertragen:
SELECTFelderWHEREFilterORDER BYSortierungenLIMIT
Beispielabfragen, die veranschaulichen, welche Aspekte AlloyDB per Pushdown verarbeiten kann und welche nicht, finden Sie in der folgenden Tabelle.
| Abfragetyp | Beispielabfrage | Abfrageelemente nach unten verschoben |
|---|---|---|
| Ungefilterte Anfragen |
SELECT id, body FROM opensearch_table ORDER BY metadata <@> 'body:foo' DESC LIMIT 10; |
|
| Genaue Textübereinstimmung |
SELECT id, body FROM opensearch_table WHERE body = 'foo' LIMIT 10; |
|
| Einzelfeldausdrücke |
SELECT id, body FROM opensearch_table WHERE id > 10 ORDER BY metadata <@> 'body:foo' LIMIT 10; |
|
| Konstante Ausdrücke |
SELECT id, body FROM opensearch_table WHERE id > (1+1) LIMIT 10; |
|
| Ausdrücke mit Funktionen |
SELECT id, body FROM opensearch_table WHERE id > CEIL(3.14) LIMIT 10; |
|
| Ausdrücke mit mehreren Feldern |
SELECT id, body FROM opensearch_table WHERE dbl_field < flt_field LIMIT 10; |
|
| Bewertungsfilterung |
SELECT id, body, (metadata <@> 'body:bar') AS score FROM opensearch_table WHERE score > 0.5 ORDER by score desc LIMIT 10; |
|
LIKE und ähnliche Operatoren |
SELECT id, body FROM opensearch_table WHERE id > 10 AND body LIKE '%foo%' LIMIT 10; |
|
| Rohdatenabfragen |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
Fehlerbehebung
Wenn bei der Abfrage Ihres OpenSearch-Clusters Authentifizierungs- oder Verbindungsprobleme auftreten, prüfen Sie die folgenden häufigen Ursachen:
- Authentifizierungsfehler 401 oder 403: Prüfen Sie, ob Ihr OpenSearch-Secret in Secret Manager einen String im Format
username:passwordenthält und ob Ihrem AlloyDB-Dienstkonto die Rolle „Zugriffsperson für Secret Manager-Secret“ (roles/secretmanager.secretAccessor) zugewiesen ist. - Zeitüberschreitungen bei Verbindungen:Prüfen Sie, ob die öffentliche IP-Verbindung für ausgehende Verbindungen in 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 sich mit den folgenden Einschränkungen vertraut machen:
Die OpenSearch-Integration ist nur für PostgreSQL-Hauptversion
17und höher verfügbar.AlloyDB liest OpenSearch-Daten, schreibt aber nicht in OpenSearch.
In AlloyDB werden Ihre Datenbankdaten nicht automatisch in OpenSearch indexiert. Sie sind dafür verantwortlich, Ihre OpenSearch-Indizes mit Daten zu füllen und die Konsistenz zwischen den Daten in AlloyDB und den indexierten Daten in OpenSearch aufrechtzuerhalten.
AlloyDB synchronisiert Schemas nicht automatisch mit OpenSearch. Wenn sich das OpenSearch-Indexschema ändert, müssen Sie das Schema der entsprechenden externen PostgreSQL-Tabelle manuell aktualisieren.
Spezielle OpenSearch-Typen wie
geo_pointwerden 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.