Cómo buscar en varias columnas de los índices de búsqueda

Los índices de búsqueda pueden indexar varias columnas tokenizadas, lo que hace que las consultas en estas columnas sean más eficientes. En esta página, se describe cómo realizar una búsqueda en varias columnas, que es un tipo de búsqueda de texto completo.

La estructura del índice de búsqueda garantiza que las consultas no necesiten una unión distribuida, lo que garantiza un rendimiento predecible de las consultas. Se evita la unión distribuida debido a la colocalización de todos los tokens que corresponden a una fila de la tabla base en la misma división.

Por ejemplo, considera el siguiente esquema:

GoogleSQL

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Studio STRING(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);

PostgreSQL

CREATE TABLE albums (
  albumid character varying NOT NULL,
  title character varying,
  studio character varying,
  title_tokens spanner.tokenlist
      GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,
  studio_tokens spanner.tokenlist
      GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,
) PRIMARY KEY(albumid);

CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);

Una consulta ahora puede buscar en dos campos: Title_Tokens y Studio_Tokens.

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
  AND SEARCH(Studio_Tokens, "Blue Note Studio")

PostgreSQL

SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'fifth symphony')
  AND spanner.search(studio_tokens, 'Blue Note Studio')

Spanner admite consultas de búsqueda de varias columnas en operadores de conjunción, disyunción y negación en la cláusula WHERE. Puedes usar todos los siguientes tipos de consultas con un índice de búsqueda:

  • Conjunción: Encuentra documentos en los que Title tenga el término "auto" y Studio tenga el término "sol".

    GoogleSQL

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
    

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')
    
  • Disyunción: Busca documentos en los que Title tenga el término "auto" o Studio tenga el término "sol".

    GoogleSQL

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
    

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')
    
  • Negación: Busca todos los documentos en los que Title no contenga el término "auto".

    GoogleSQL

    SELECT AlbumId
    FROM Albums
    WHERE NOT SEARCH(Title_Tokens, 'car')
    

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE NOT spanner.search(title_tokens, 'car')
    

    El lenguaje rquery puede realizar el mismo tipo de búsquedas:

    GoogleSQL

    SELECT AlbumId
    FROM Albums
    WHERE SEARCH(Title_Tokens, '-car')
    

    PostgreSQL

    SELECT albumid
    FROM albums
    WHERE spanner.search(title_tokens, '-car')
    

    Ambos formularios filtran los documentos en los que Title es NULO. Las funciones de tokenización y búsqueda se definen para mostrar NULL en la entrada NULL. SQL define NOT NULL como NULL.

Además, puedes hacer referencia a la misma columna TOKENLIST varias veces.

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
  AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))

PostgreSQL

SELECT albumid
FROM albums
WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))
  AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))

Usa el lenguaje rquery o SQL para buscar varios términos en la misma columna. Se recomienda rquery debido a su caché de consultas eficiente para consultas parametrizadas. Además de la mejor tasa de aciertos de la caché de consultas, los lenguajes rquery y SQL tienen las mismas tasas de latencia y rendimiento.

GoogleSQL

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car OR guy')

SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')

PostgreSQL

SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car OR guy')

SELECT albumid
FROM albums
WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')

También puedes usar condiciones que no sean de texto aceleradas con índices de búsqueda en la misma consulta con funciones de búsqueda de texto completo.

¿Qué sigue?