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 est un type de recherche en texte intégral.
Effectuer une recherche multicolonne
La structure de l'index de recherche garantit que les requêtes n'ont pas besoin d'une jointure distribuée, ce qui garantit des performances prévisibles des requêtes. 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:
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);
Une requête peut désormais rechercher dans les deux champs:
SELECT AlbumId
FROM Albums
WHERE SEARCH(Title_Tokens, "fifth symphony")
AND SEARCH(Studio_Tokens, "Blue Note Studio")
Spanner est compatible avec les requêtes de recherche multicolonne dans les opérateurs de conjonction, de disjonction et de négation de la clause WHERE
. Vous pouvez utiliser tous les types de requêtes suivants avec un indice de recherche:
Conjonction: recherchez les documents dans lesquels
Title
contient le terme "voiture" etStudio
le terme "soleil".SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')
Disjonction: recherchez les documents dans lesquels
Title
contient le terme "voiture" ouStudio
contient le terme "soleil".SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')
Négation: recherchez tous les documents où
Title
ne contient pas le terme "voiture".SELECT AlbumId FROM Albums WHERE NOT SEARCH(Title_Tokens, 'car')
Le langage rquery peut effectuer le même type de recherches:
SELECT AlbumId FROM Albums WHERE SEARCH(Title_Tokens, '-car')
Les deux formats filtrent les documents où
Title
est NULL. Les fonctions de tokenisation et de recherche sont définies pour renvoyer NULL en entrée NULL. SQL définit NOT NULL comme NULL.
Vous pouvez également faire référence à la même colonne TOKENLIST
plusieurs fois.
SELECT AlbumId
FROM Albums
WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))
AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))
Utilisez le langage rquery ou SQL pour rechercher plusieurs termes dans la même colonne. Nous vous recommandons d'utiliser rquery en raison de son mise en cache efficace des requêtes pour les requêtes paramétrées. Outre le meilleur taux de succès de cache (hit) de requêtes, les langages rquery et SQL ont les mêmes taux de latence et de performances.
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')
Vous pouvez utiliser des conditions non textuelles accélérées avec des index de recherche 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.