Combiner des requêtes en texte intégral et non textuelles

Cette page explique comment effectuer une recherche qui combine du texte intégral et non textuel. données.

Compatibilité avec les index de recherche des colonnes en texte intégral, en mot clé exact et en chiffres. Vous pouvez combiner des conditions textuelles et non textuelles dans la clause WHERE, comme dans les requêtes de recherche multicolonne. L'optimiseur de requêtes tente d'optimiser les prédicats non textuels avec un indice de recherche. Si c'est impossible, Spanner évalue la condition pour chaque ligne qui correspond à l'index de recherche. Colonnes référencées non stockées dans l'index de recherche sont extraites de la table de base.

Prenons l'exemple suivant :

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  Title STRING(MAX),
  Rating FLOAT64,
  Genres ARRAY<STRING(MAX)>,
  Likes INT64,
  Cover BYTES(MAX),
  Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
  Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
  Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING Likes;

Le comportement des requêtes sur cette table est le suivant:

  • Rating et Genres sont inclus dans l'index de recherche. Spanner accélère les conditions à l'aide de listes d'insertion d'index de recherche.

    SELECT Album
    FROM Albums
    WHERE Rating > 4
      AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • La requête peut combiner des conjonctions, des disjonctions et des négations de quelque manière que ce soit, y compris en mélangeant des prédicats de texte complet et non textuels. Cette requête est entièrement accélérée par l'index de recherche.

    SELECT Album
    FROM Albums
    WHERE (SEARCH(Title_Tokens, 'car')
           OR Rating > 4)
      AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])
    
  • Likes est stocké dans l'index, mais le schéma ne demande pas à Spanner de créer un index de jetons pour ses valeurs possibles. Par conséquent, le prédicat de texte intégral sur Title et le prédicat non textuel sur Title Rating est accéléré, mais pas le prédicat sur Likes. Dans Spanner, la requête extrait tous les documents comportant le terme "voiture" dans le Title et une note supérieure à 4, il filtre les documents qui n'ont pas enregistré au moins 1 000 "J'aime". Cette requête utilise beaucoup de ressources tous les albums contiennent le terme "voiture" dans leur titre, et presque tous ont 5, mais peu d'albums comptent 1 000 "J'aime". Dans ce cas, l'indexation Likes, comme Rating, permet d'économiser des ressources.

    SELECT Album
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
      AND Likes >= 1000
    
  • Cover n'est pas stocké dans l'index. La requête suivante effectue une jointure arrière entre AlbumsIndex et Albums pour récupérer Cover pour tous les albums correspondants.

    SELECT AlbumId, Cover
    FROM Albums
    WHERE SEARCH(Title_Tokens, 'car')
      AND Rating > 4
    

Étape suivante