Cette page explique comment effectuer une recherche qui combine du texte intégral et non textuel. données.
Effectuer une recherche mixte en texte intégral et non textuelle
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
etGenres
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 surTitle
et le prédicat non textuel surTitle
Rating
est accéléré, mais pas le prédicat surLikes
. Dans Spanner, la requête extrait tous les documents comportant le terme "voiture" dans leTitle
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'indexationLikes
, commeRating
, 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 entreAlbumsIndex
etAlbums
pour récupérerCover
pour tous les albums correspondants.SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4
É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 effectuer une recherche dans plusieurs colonnes.