Rechercher dans plusieurs colonnes dans des index de recherche

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 dans plusieurs colonnes, ce qui est un type de recherche dans le texte complet.

La structure de la recherche indice garantit que les requêtes n'ont pas besoin d'une jointure distribuée, ce qui garantit des les performances des requêtes. La jointure distribuée est évitée en raison de la la colocation de tous les jetons qui correspondent à une ligne de la 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 maintenant effectuer une recherche dans les deux champs:

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

Spanner accepte les requêtes de recherche multicolonnes conjointement, les opérateurs de disjonction et de négation dans la clause WHERE. Vous pouvez utiliser toutes les types de requêtes suivants avec un index de recherche:

  • Conjonction: rechercher des documents dans lesquels Title contient le terme "voiture" et Studio utilise 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" ou Studio 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. Tokenisation et les fonctions de recherche sont définies pour renvoyer NULL en cas d'entrée NULL. SQL définit NOT NULL as NULL.

De plus, vous pouvez référencer 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 réussite du cache de requêtes, les langages R 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 comportant du texte intégral fonctions de recherche.

Étape suivante