Neben dem Indexieren von Text bietet der Spanner-Suchindex eine effiziente Möglichkeit, JSON- und JSONB-Dokumente zu indexieren und abzufragen. Verwenden Sie Suchindizes für eigenständige JSON- und JSONB-Abfragen oder um andere VolltextsuchAbfragen zu erweitern.
Weitere Informationen finden Sie unter JSON-Daten indexieren und JSONB-Daten indexieren.
JSON und JSONB tokenisieren
Mit der Funktion TOKENIZE_JSON können Sie einen JSON-Index in
GoogleSQL erstellen. Mit der Funktion TOKENIZE_JSONB können Sie einen JSONB-Index in
PostgreSQL erstellen. Weitere Informationen finden Sie unter TOKENIZE_JSON
und TOKENIZE_JSONB.
JSON- und JSONB-Abfragen
Sie können einen Suchindex verwenden, um Abfragen zu beschleunigen, die die folgenden Bedingungen enthalten: Gleichheitsvergleiche, JSON-Einschlüsse und Schlüsselvorhandensein :
- Gleichheitsvergleiche bestimmen, ob ein JSON-Dokument oder ein Unterpfad in einem JSON-Dokument einem Zielwert entspricht.
- JSON-Einschluss bestimmt, ob ein JSON-Dokument in einem anderen enthalten ist.
- Schlüssel vorhanden bestimmt, ob ein Schlüssel oder Pfad in einem JSON-Dokument vorhanden ist.
Sie können diese Bedingungen in jedem Dialekt so ausdrücken:
In GoogleSQL:
- Erstellen Sie Gleichheitsprädikate mit den
=,!=,<>,INundNOT INOperatoren für eine indexierteJSON-Spalte oder einen Unterpfad, der mit den Operatoren für den Feldzugriff und den Subscript-Operator extrahiert wurde. Beispiele:doc = JSON '{"a": 1}',doc.sub.path[0].key = "value", oderdoc.status IN ("active", "pending"). Andere Vergleichsoperatoren wie<,<=,>, und>=werden von JSON-Suchindizes nicht beschleunigt. - Drücken Sie den JSON-Einschluss in Ihrem Schema mit der
JSON_CONTAINSFunktion aus. - Erstellen Sie Bedingungen für das Vorhandensein von Schlüsseln mit den Operatoren für den Feldzugriff, den Array-Subscript-Operator und
IS NOT NULL. Die Operatoren für den Feldzugriff und den Array-Subscript-Operator beschreiben einen JSON-Dokumentpfad.IS NOT NULLprüft, ob dieser Pfad vorhanden ist (z. B.doc.sub.path[@index].key IS NOT NULL).
- Erstellen Sie Gleichheitsprädikate mit den
In PostgreSQL:
- Erstellen Sie Gleichheitsprädikate mit den
=,!=,<>,IN, undNOT INOperatoren für eine indexierteJSONB-Spalte oder einen Unterpfad, der mit dem->Operator extrahiert wurde. Beispiele:doc = '{"a": 1}'::jsonb,doc->'sub'->0->'key' = '"value"'::jsonboderdoc->'status' IN ('"active"'::jsonb, '"pending"'::jsonb). Andere Vergleichsoperatoren wie<,<=,>, und>=sowie Text extraktionsprädikate, die->>verwenden, werden von JSONB-Such indizes nicht beschleunigt. - Drücken Sie den JSONB-Einschluss mit den
@>und<@Operatoren aus. Weitere Informationen finden Sie unter JSONB-Operatoren. - Erstellen Sie Bedingungen für das Vorhandensein von Schlüsseln mit den
?,?|, und?&Operatoren. Weitere Informationen finden Sie unter JSONB-Operatoren.
- Erstellen Sie Gleichheitsprädikate mit den
In Ihren Abfragen können Sie mehrere JSON-Bedingungen beliebigen Typs in den Suchindex aufnehmen. Sie können die JSON-Bedingungen auch mit AND, OR und NOT logisch kombinieren.
Nutzung des Suchindex prüfen
Wenn Sie prüfen möchten, ob Ihre Abfrage einen Suchindex verwendet, suchen Sie im Abfrageausführungsplan nach einem Suchindex-Scan-Knoten.
Beschränkungen
- Suchindizes, einschließlich JSON- und JSONB-Suchindizes, werden nur in schreibgeschützten Transaktionen verwendet. Spanner kann in einer Lese-/Schreibtransaktion relevante sekundäre Indizes verwenden. Wenn Sie die Verwendung eines
Suchindex in einer Lese-/Schreibtransaktion erzwingen möchten, tritt der folgende Fehler auf:
ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default." - Wenn Sie versuchen, bestimmte große oder sehr komplexe JSON-Dokumente in einem Suchindex zu speichern, wird möglicherweise der Fehler
too many search token byteszurückgegeben. Die Ausgabetokengröße dieses JSON-Dokuments muss kleiner als 10 MB sein. Wenn nicht das gesamte Dokument durchsuchbar sein muss, können Sie eine kleinere Teilmenge des Dokuments extrahieren (z. B. mit einer generierten Spalte) und stattdessen in der Spalte suchen.
Nächste Schritte
- Informationen zur Tokenisierung und zu Tokenizern
- Informationen zu Suchindizes.
- Informationen zum Indexieren von JSON-Daten
- Informationen zum Indexieren von JSONB-Daten