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 hacer una búsqueda en varias columnas, que es un tipo de búsqueda en todo el texto.
Hacer una búsqueda en varias columnas
La estructura del índice de búsqueda asegura 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 colocación conjunta de todos los tokens que corresponden a una fila de la tabla base en la misma división.
Por ejemplo, supongamos que se da 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);
Ahora, una consulta 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 junto con operadores de conjunción, disyunción y negación en la cláusula WHERE
. Puedes usar todos los tipos de consultas siguientes con un índice de búsqueda:
Conjunción: busca documentos en los que
Title
contenga el término "coche" yStudio
contenga 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
contenga el término "coche" oStudio
contenga 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 "coche".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 de 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')
Ambas formas filtran los documentos en los que
Title
es NULL. Las funciones de tokenización y búsqueda se definen para devolver 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 de consulta rquery o SQL para buscar varios términos en la misma columna. Te recomendamos rquery porque ofrece un almacenamiento en caché de consultas eficiente para las consultas con parámetros. Además de la mejor tasa de aciertos de la caché de consultas, los lenguajes de consulta 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.
Siguientes pasos
- Consulta información sobre las consultas de búsqueda de texto completo.
- Consulta cómo clasificar los resultados de búsqueda.
- Consulte cómo realizar una búsqueda de subcadenas.
- Consulta cómo paginar los resultados de búsqueda.
- Consulta cómo combinar consultas de texto completo y consultas que no son de texto.