Index de recherche JSON

En plus d'indexer du texte, l'index de recherche Spanner offre un moyen efficace d'indexer et d'interroger des documents JSON et JSONB. Utilisez des index de recherche pour les requêtes JSON et JSONB autonomes, ou pour compléter d'autres requêtes de recherche en texte intégral.

Pour en savoir plus, consultez Indexer des données JSON et Indexer des données JSONB.

Tokeniser des données JSON et JSONB

Vous pouvez utiliser la fonction TOKENIZE_JSON pour créer un index JSON en langage GoogleSQL, ou la fonction TOKENIZE_JSONB pour créer un index JSONB en langage PostgreSQL. Pour en savoir plus, consultez TOKENIZE_JSON et TOKENIZE_JSONB.

Requêtes JSON et JSONB

Vous pouvez utiliser un index de recherche pour accélérer les requêtes qui incluent des comparaisons d'égalité, du confinement JSON et des conditions d'existence de clé :

  • Les comparaisons d'égalité déterminent si un document JSON ou un sous-chemin dans un document JSON est égal à une valeur cible.
  • Le confinement JSON détermine si un document JSON est contenu dans un autre.
  • L'existence de clé détermine si une clé ou un chemin existe dans un document JSON.

Vous pouvez exprimer ces conditions dans chaque dialecte comme suit :

  • En langage GoogleSQL :

    • Créez des prédicats d'égalité à l'aide des =, !=, <>, IN, et NOT IN opérateurs sur une colonne JSON indexée ou un sous-chemin extrait avec les opérateurs d'accès aux champs et d'indice. Par exemple, doc = JSON '{"a": 1}', doc.sub.path[0].key = "value", ou doc.status IN ("active", "pending"). Les autres opérateurs de comparaison tels que <, <=, >, et >= ne sont pas accélérés par les index de recherche JSON.
    • Exprimez le confinement JSON dans votre schéma à l'aide de la JSON_CONTAINS fonction.
    • Créez des conditions d'existence de clé à l'aide des opérateurs d'accès aux champs, d'indice de tableau et IS NOT NULL. Les opérateurs d'accès aux champs et d'indice de tableau décrivent un chemin de document JSON. IS NOT NULL vérifie l'existence de ce chemin (par exemple, doc.sub.path[@index].key IS NOT NULL).
  • En langage PostgreSQL :

    • Créez des prédicats d'égalité à l'aide des =, !=, <>, IN, et NOT IN opérateurs sur une colonne JSONB indexée ou un sous-chemin extrait avec l' -> opérateur. Par exemple, doc = '{"a": 1}'::jsonb, doc->'sub'->0->'key' = '"value"'::jsonb ou doc->'status' IN ('"active"'::jsonb, '"pending"'::jsonb). Les autres opérateurs de comparaison tels que <, <=, >, et >=, ainsi que les prédicats d'extraction de texte qui utilisent ->>, ne sont pas accélérés par les index de recherche JSONB.
    • Exprimez le confinement JSONB à l'aide des opérateurs @> et <@. Pour en savoir plus, consultez Opérateurs JSONB.
    • Créez des conditions d'existence de clé à l'aide des opérateurs ?, ?| et ?&. Pour en savoir plus, consultez Opérateurs JSONB.

Dans vos requêtes, vous pouvez inclure plusieurs conditions JSON de n'importe quel type dans l'index de recherche. Vous pouvez également inclure les conditions JSON dans une combinaison logique à l'aide de AND, OR et NOT.

Vérifier l'utilisation de l'index de recherche

Pour vérifier que votre requête utilise un index de recherche, recherchez un nœud Search index scan dans le plan d’exécution de la requête.

Restrictions

  • Les index de recherche, y compris les index de recherche JSON et JSONB, ne sont utilisés que dans les transactions en lecture seule. Spanner peut utiliser des index secondaires pertinents dans une transaction en lecture/écriture. Si vous tentez de forcer l'utilisation d'un index de recherche dans une transaction en lecture/écriture, l'erreur suivante se produit : ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default."
  • Les tentatives de stockage de certains documents JSON volumineux ou très complexes dans un index de recherche peuvent renvoyer une erreur too many search token bytes. La taille du jeton de sortie de ce document JSON doit être inférieure à 10 Mo. Si vous n'avez pas besoin que l'ensemble du document soit consultable, envisagez d'extraire un sous-ensemble plus petit du document (par exemple, à l'aide d'une colonne générée) et d'effectuer une recherche dans la colonne à la place.

Étape suivante