Combiner des TOKENLIST

<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:

  1. Tokenisez les mots séparément et concaténez les valeurs TOKENLIST obtenues (recommandé).
  2. Concaténez des chaînes et tokenisez le résultat.

La deuxième approche pose deux problèmes:

  1. Si vous souhaitez indexer Title ou Studio individuellement, en plus de les indexer dans un TOKENLIST combiné, le même texte est tokenisé deux fois. Cela amène les transactions à utiliser plus de ressources.
  2. Une recherche d'expression couvre les deux champs. Par exemple, si @p est défini sur "Blue Note", il correspond à une ligne contenant à la fois Title="Big Blue Note" et Studio="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