JSON-Suchindexe

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 =, !=, <>, IN und NOT IN Operatoren für eine indexierte JSON-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", oder doc.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_CONTAINS Funktion 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 NULL prüft, ob dieser Pfad vorhanden ist (z. B. doc.sub.path[@index].key IS NOT NULL).
  • In PostgreSQL:

    • Erstellen Sie Gleichheitsprädikate mit den =, !=, <>, IN, und NOT IN Operatoren für eine indexierte JSONB-Spalte oder einen Unterpfad, der mit dem -> Operator extrahiert wurde. Beispiele: doc = '{"a": 1}'::jsonb, doc->'sub'->0->'key' = '"value"'::jsonb oder doc->'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.

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 bytes zurü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