<ph type="x-smartling-placeholder">
Cette page explique comment concaténer des éléments TOKENLIST
dans un
index de recherche lorsque vous configurez votre schéma
ou dans une requête de recherche lors d'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 fois, 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, il existe deux façons d'y parvenir:
- Tokenisez les mots séparément et concaténez les valeurs
TOKENLIST
obtenues (recommandé). - Concaténez des chaînes et tokenisez le résultat.
La deuxième approche pose 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. Cela amène les transactions à utiliser plus de ressources. - Une recherche d'expression couvre les 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 obtenus sont stockés 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 de TOKENLIST
peut également être entièrement implémentée côté requête.
Pour en savoir plus, consultez la section Concaténation 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. Cela est utile lorsque vous souhaitez ajouter
la colonne à 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 tokeniser 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. Concaténation de TOKENLIST
colonnes côté requête
évite ce coût, mais la requête utilise davantage 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
avec les lignes "bleu" et "note" dans la colonne Title
, "bleu" et "note" dans
colonne Studio
et "bleu" dans la colonne Title
et "note" dans le Studio
une colonne, 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