Índices de búsqueda de JSON

Además de indexar texto, el índice de la Búsqueda de Spanner search index proporciona una forma eficiente de indexar y consultar documentos JSON y JSONB. Usa índices de la Búsqueda para consultas JSON y JSONB independientes, o para aumentar otras consultas de búsqueda de texto completo.

Para obtener más información, consulta Indexa datos JSON y Indexa datos JSONB.

Tokeniza JSON y JSONB

Puedes usar la función TOKENIZE_JSON para crear un índice JSON en GoogleSQL o la función TOKENIZE_JSONB para crear un índice JSONB en PostgreSQL. Para obtener más información, consulta TOKENIZE_JSON y TOKENIZE_JSONB.

Consultas JSON y JSONB

Puedes usar un índice de búsqueda para acelerar las consultas que incluyen comparaciones de igualdad, contención JSON y existencia de claves condiciones:

  • Las comparaciones de igualdad determinan si un documento JSON o una subruta dentro de un documento JSON es igual a un valor objetivo.
  • La contención JSON determina si un documento JSON está contenido dentro de otro.
  • La existencia de claves determina si existe una clave o una ruta en un documento JSON.

Puedes expresar estas condiciones en cada dialecto de la siguiente manera:

  • En GoogleSQL:

    • Crea predicados de igualdad con los operadores =, !=, <>, IN, y NOT IN en una columna JSON indexada o una subruta extraída con los operadores de acceso a campos y subíndices. Por ejemplo, doc = JSON '{"a": 1}', doc.sub.path[0].key = "value", o doc.status IN ("active", "pending"). Los índices de búsqueda JSON no aceleran otros operadores de comparación como <, <=, >, y >=.
    • Expresa la contención JSON en tu esquema con la JSON_CONTAINS función.
    • Crea condiciones de existencia de claves con los operadores de acceso a campos, subíndices de array y IS NOT NULL. Los operadores de acceso a campos y subíndices de array describen una ruta de documento JSON. IS NOT NULL verifica la existencia de esta ruta (por ejemplo, doc.sub.path[@index].key IS NOT NULL).
  • En PostgreSQL:

    • Crea predicados de igualdad con los =, !=, <>, IN, y NOT IN operadores en una columna JSONB indexada o una subruta extraída con el -> operador. Por ejemplo, doc = '{"a": 1}'::jsonb, doc->'sub'->0->'key' = '"value"'::jsonb o doc->'status' IN ('"active"'::jsonb, '"pending"'::jsonb). Los índices de búsqueda JSONB no aceleran otros operadores de comparación, como <, <=, >, y >=, ni los predicados de extracción de texto que usan ->>.
    • Expresa la contención JSONB con los @> y <@ operadores. Para obtener más información, consulta Operadores JSONB.
    • Crea condiciones de existencia de claves con los operadores ?, ?| y ?&. Para obtener más información, consulta Operadores JSONB.

En tus consultas, puedes incluir varias condiciones JSON de cualquier tipo en el índice de búsqueda. También puedes incluir las condiciones JSON en una combinación lógica con AND, OR y NOT.

Verifica el uso del índice de búsqueda

Para verificar que tu consulta use un índice de la Búsqueda, busca un Search index scan nodo en el plan de ejecución de consultas.

Restricciones

  • Los índices de búsqueda, incluidos los índices de búsqueda JSON y JSONB, solo se usan en transacciones de solo lectura. Spanner puede usar índices secundarios relevantes en una transacción de lectura y escritura. Si intentas forzar el uso de un índice de búsqueda en una transacción de lectura y escritura, se produce el siguiente error: ERROR: spanner: code = "InvalidArgument", desc = "The search index AlbumsIndex cannot be used in transactional queries by default."
  • Si intentas almacenar ciertos documentos JSON grandes o muy complejos en un índice de la Búsqueda, es posible que se muestre un error too many search token bytes. El tamaño del token de salida de este documento JSON debe ser inferior a 10 MB. Si no necesitas que se pueda buscar todo el documento, considera extraer un subconjunto más pequeño del documento (por ejemplo, con una columna generada) y realizar la búsqueda en la columna.

¿Qué sigue?