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, etNOT INopérateurs sur une colonneJSONindexé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", oudoc.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_CONTAINSfonction. - 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 NULLvérifie l'existence de ce chemin (par exemple,doc.sub.path[@index].key IS NOT NULL).
- Créez des prédicats d'égalité à l'aide des
En langage PostgreSQL :
- Créez des prédicats d'égalité à l'aide des
=,!=,<>,IN, etNOT INopérateurs sur une colonneJSONBindexée ou un sous-chemin extrait avec l'->opérateur. Par exemple,doc = '{"a": 1}'::jsonb,doc->'sub'->0->'key' = '"value"'::jsonboudoc->'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.
- Créez des prédicats d'égalité à l'aide des
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
- En savoir plus sur la tokenisation et les tokeniseurs.
- En savoir plus sur les index de recherche.
- En savoir plus sur l'indexation des données JSON.
- En savoir plus sur l'indexation des données JSONB.