Cette page explique comment concaténer des TOKENLIST
dans un index de recherche lorsque vous configurez votre schéma ou dans une requête de recherche lorsque vous effectuez une recherche en texte intégral dans Spanner.
Combiner des TOKENLIST dans un index de recherche
Parfois, vous devez que votre application recherche dans des champs individuels. À d'autres moments, l'application doit effectuer une recherche dans tous les champs. Par exemple, dans un tableau comportant deux colonnes de chaîne, vous pouvez souhaiter que votre application recherche dans les deux colonnes sans différencier la colonne d'où proviennent les correspondances.
Dans Spanner, vous pouvez procéder de deux façons:
- Tokenisez les mots séparément et concaténez les valeurs
TOKENLIST
obtenues (recommandé). - Concaténer des chaînes et tokenizer le résultat
La deuxième approche présente deux problèmes:
- Si vous souhaitez indexer
Title
ouStudio
individuellement, en plus de les indexer dans unTOKENLIST
combiné, le même texte est tokenisé deux fois. Les transactions utilisent ainsi plus de ressources. - Une recherche par expression s'applique aux deux champs. Par exemple, si
@p
est défini sur"Blue Note"
, il correspond à une ligne contenant à la foisTitle
="Big Blue Note" etStudio
="Blue Note Studios".
La première approche résout ces problèmes, car une expression ne correspond qu'à un seul champ et chaque champ de chaîne n'est tokenisé qu'une seule fois si les TOKENLIST
individuels et combinés sont indexés. Même si chaque champ de chaîne n'est tokenisé qu'une seule fois, les TOKENLISTS générées sont stockées séparément dans l'index.
Tokeniser les mots séparément et concaténer les valeurs TOKENLIST
L'exemple suivant tokenize chaque mot et concatène les valeurs TOKENLIST
:
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,
Combined_Tokens TOKENLIST AS (TOKENLIST_CONCAT([Title_Tokens, Studio_Tokens])) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);
SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);
La concaténation TOKENLIST
peut également être entièrement implémentée côté requête.
Pour en savoir plus, consultez la section Concatenation TOKENLIST
côté requête.
TOKENLIST_CONCAT
est compatible avec les recherches en texte intégral et en sous-chaîne.
Spanner ne vous permet pas de mélanger des types de tokenisation, tels que TOKENIZE_FULLTEXT
et TOKENIZE_SUBSTRING
dans le même appel TOKENLIST_CONCAT
.
La définition des colonnes de texte TOKENLIST
peut être modifiée dans les colonnes non stockées pour ajouter des colonnes supplémentaires. Cela est utile lorsque vous souhaitez ajouter une colonne supplémentaire à TOKENLIST_CONCAT
. La modification de l'expression de la colonne générée ne remplit pas les lignes existantes de l'index.
Concaténer des chaînes et tokenizer le résultat
L'exemple suivant concatène des chaînes et tokenize le résultat:
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Studio STRING(MAX),
Combined_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title || " " || Studio)) HIDDEN,
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(Combined_Tokens);
SELECT AlbumId FROM Albums WHERE SEARCH(Combined_Tokens, @p);
Concaténation TOKENLIST
côté requête
L'inconvénient de l'indexation de l'TOKENLIST
concaténé est qu'elle augmente les coûts de stockage et d'écriture. Chaque jeton est désormais stocké sur le disque deux fois : une fois dans une liste de publication de son TOKENLIST
d'origine et une fois dans une liste de publication de l'TOKENLIST
combinée. La concaténation côté requête des colonnes TOKENLIST
évite ce coût, mais la requête utilise plus de ressources de calcul.
Pour concaténer plusieurs TOKENLIST
, utilisez la fonction TOKENLIST_CONCAT
dans la requête SEARCH
. Pour cette section, nous utilisons l'exemple de 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);
La requête suivante recherche les lignes contenant les jetons "blue" et "note" dans les colonnes Title
et Studio
. Cela inclut les lignes contenant à la fois "blue" et "note" dans la colonne Title
, "blue" et "note" dans la colonne Studio
, et "blue" dans la colonne Title
et "note" dans la colonne Studio
, ou l'inverse.
SELECT AlbumId
FROM Albums
WHERE SEARCH(TOKENLIST_CONCAT([AlbumTitle_Tokens, Studio_Tokens]), 'blue note')
La concatenaison TOKENLIST
côté écriture et côté requête produit des résultats identiques.
Le choix entre les deux est un compromis entre le coût du disque et le coût des requêtes.
Une application peut également rechercher plusieurs colonnes TOKENLIST
et utiliser OR
avec la fonction SEARCH
:
SEARCH(AlbumTitle_Tokens, 'Blue Note') OR SEARCH(Studio_Tokens, 'Blue Note')
Cependant, la sémantique est différente. Il ne correspond pas aux albums où AlbumTitle_Tokens
contient "bleu", mais pas "note", et Studio_Tokens
contient "note", mais pas "bleu".
Étape suivante
- En savoir plus sur les requêtes de recherche en texte intégral
- En savoir plus sur les index de recherche