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:
Aktivieren Sie ausgehende Verbindungen auf Ihrer primären AlloyDB-Instanz.
Erstellen und konfigurieren Sie OpenSearch 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, um auf Ihren OpenSearch-Cluster zuzugreifen.
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.
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 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.123456789012ist Ihre Google Cloud -Projekt-ID.
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;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_TYPEhat. 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 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.
Hybridsuchen
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 Feldopensearch_field_namenach 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:
SELECTFelderWHEREFilterORDER BYSortierungLIMIT
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; |
|
| 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; |
|
| Score-Filterung |
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; |
|
| Unbearbeitete Abfragen |
SELECT id, body FROM opensearch_table WHERE id < 10 ORDER BY metadata <@> $${"query": { "match_all": {}}}$$ DESC LIMIT 10; |
|
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:passwordenthä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
17verfü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_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.