Les index de recherche peuvent indexer plusieurs colonnes tokenisées, ce qui rend les requêtes sur ces colonnes plus efficaces. Cette page explique comment effectuer une recherche sur plusieurs colonnes, ce qui correspond à un type de recherche en texte intégral.
Effectuer une recherche sur plusieurs colonnes
La structure de l'index de recherche garantit que les requêtes n'ont pas besoin d'une jointure distribuée, ce qui assure des performances prévisibles . La jointure distribuée est évitée en raison de la colocalisation de tous les jetons correspondant à une ligne de table de base sur la même division.
Prenons l'exemple du schéma suivant :
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);
Une requête peut désormais rechercher deux champs : Title_Tokens et 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 est compatible avec les requêtes de recherche sur plusieurs colonnes en conjonction, disjonction et opérateurs de négation dans la clause WHERE. Vous pouvez utiliser tous les types de requêtes suivants avec un index de recherche :
Conjonction : recherchez les documents dans lesquels
Titlecontient le terme "car" etStudiocontient le terme "sun".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')Disjonction : recherchez les documents dans lesquels
Titlecontient le terme "car" ouStudiocontient le terme "sun".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')Négation : recherchez tous les documents dans lesquels
Titlene contient pas le terme "car".GoogleSQL
SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')PostgreSQL
SELECT albumid FROM albums WHERE NOT spanner.search(title_tokens, 'car')Le langage rquery peut effectuer le même type de recherches :
GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(title_tokens, '-car')Les deux formulaires filtrent les documents dans lesquels
Titleest NULL. Les fonctions de tokenisation et de recherche sont définies pour renvoyer NULL sur une entrée NULL. SQL définit NOT NULL comme NULL.
De plus, vous pouvez référencer la même colonne TOKENLIST plusieurs fois.
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'))
Utilisez le langage rquery ou SQL pour rechercher plusieurs termes dans la même colonne. rquery est recommandé en raison de sa mise en cache efficace des requêtes pour les requêtes paramétrées. Outre le meilleur taux de succès de cache (hit) des requêtes, les langages rquery et SQL ont les mêmes taux de latence et de performances.
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')
Vous pouvez également utiliser des conditions non textuelles accélérées avec des index de recherche dans la même requête avec des fonctions de recherche en texte intégral.
Étape suivante
- En savoir plus sur les requêtes de recherche en texte intégral.
- Découvrez comment classer les résultats de recherche.
- Découvrez comment effectuer une recherche de sous-chaîne.
- Découvrez comment paginer les résultats de recherche.
- Découvrez comment combiner des requêtes en texte intégral et non textuelles.