Combina consultas de texto completo y no de texto

En esta página, se describe cómo realizar una búsqueda que combine datos de texto completo y no de texto.

Los índices de búsqueda admiten columnas numéricas, de texto completo y de concordancia exacta. Puedes combinar condiciones de texto y no texto en la cláusula WHERE de manera similar a las búsquedas de varias columnas. El el optimizador de consultas intenta optimizar predicados que no son de texto con un índice de búsqueda. Si imposible, Spanner evalúa el estado de cada fila que coincida con el índice de búsqueda. Las columnas a las que se hace referencia y que no se almacenan en el índice de búsqueda se recuperan de la tabla base.

Por ejemplo, considera el siguiente ejemplo:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Rating FLOAT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64,
  Cover BYTES(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
  Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;

El comportamiento de las consultas en esta tabla incluye los siguientes aspectos:

  • Rating y Genres se incluyen en el índice de búsqueda. Spanner acelera las condiciones mediante la publicación del índice de búsqueda listas.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • La consulta puede combinar conjunciones, disyunciones y negaciones de cualquier manera, incluso mezclar predicados de texto completo y no de texto. El índice de búsqueda acelera esta consulta por completo.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes se almacena en el índice, pero el esquema no solicita Spanner crea un índice de tokens para sus valores posibles. Por lo tanto, se acelera el predicado de texto completo en Title y el predicado que no es de texto en Rating, pero no el predicado en Likes. En Spanner, la consulta recupera todos los documentos con el término "car" en el Title y una calificación superior a 4. Luego, filtra los documentos que no tienen al menos 1,000 Me gusta. Esta consulta usa muchos recursos si casi todos los álbumes tienen el término "auto" en el título y casi todos tienen una calificación de 5, pero pocos álbumes tienen 1,000 Me gusta. En esos casos, la indexación Likes, al igual que Rating, ahorra recursos.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover no se almacena en el índice. La siguiente consulta realiza una búsqueda de unión entre AlbumsIndex y Albums para recuperar Cover para todos los álbumes que coincidan.

    SELECT AlbumId, Cover
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
    

¿Qué sigue?