Cette page explique comment ajouter la tokenisation aux tableaux. La tokenisation est nécessaire pour créer les jetons utilisés dans l'index de recherche.
La tokenisation est le processus qui consiste à transformer des valeurs en jetons. La méthode que vous utilisez pour tokeniser un document détermine les types et l'efficacité des recherches que les utilisateurs peuvent effectuer dessus.
Spanner fournit des tokenizers pour le texte en langage naturel, les sous-chaînes, le texte verbatim, les nombres et les booléens. Le schéma de la base de données utilise le tokenizer correspondant au type de recherche requis pour la colonne. Les tokenizers présentent les caractéristiques suivantes:
- Chaque tokenizer est une fonction SQL qui reçoit une entrée, telle qu'une chaîne ou un nombre, et des arguments nommés pour des options supplémentaires.
- Le tokenizer renvoie un
TOKENLIST
.
Par exemple, une chaîne de texte The quick brown fox jumps over the lazy dog
est tokenisée en [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
Une chaîne HTML The <b>apple</b> is <i>red</i>
est tokenisée en [the,apple,is,red]
.
Les jetons présentent les caractéristiques suivantes:
- Les jetons sont stockés dans des colonnes qui utilisent le type de données
TOKENLIST
. - Chaque jeton est stocké sous la forme d'une séquence d'octets, avec un ensemble facultatif d'attributs associés. Par exemple, dans les applications de texte intégral, un jeton est généralement un seul mot d'un document textuel.
- Lors de la tokenisation des valeurs HTML, Spanner génère des attributs qui indiquent l'importance d'un jeton dans le document. Spanner utilise ces attributs pour le calcul des scores afin de mettre en avant les termes les plus importants (tels qu'un titre).
Analyseurs lexicaux
Spanner accepte les fonctions de tokenizer suivantes:
Le tokeniseur de texte intégral (
TOKENIZE_FULLTEXT
) produit des jetons de mots entiers pour les requêtes en langage naturel.Exemple
Les deux fonctions suivantes
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
produisent les mêmes jetons:
[yellow,apple]
.Le tokenizeur de sous-chaîne (
TOKENIZE_SUBSTRING
) génère des jetons pour chaque n-gramme de chaque mot. Il permet de trouver des sous-chaînes de mots dans un texte.Exemple
TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
Génère les jetons suivants:
[ello,hell,hello,orld,worl,world]
.Le tokenizeur de n-grammes (
TOKENIZE_NGRAMS
) génère des n-grammes à partir d'une entrée (sans la diviser en mots distincts). Il permet d'accélérer les prédicats d'expression régulière.Exemple
La fonction suivante:
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
Génère les jetons suivants:
["Big ","ig T","g Ti"," Tim", "Time"]
.Les tokenizers de correspondance exacte (
TOKEN
etTOKENIZE_BOOL
) permettent de rechercher des lignes contenant une certaine valeur dans l'une de leurs colonnes. Par exemple, une application qui indexe un catalogue de produits peut vouloir rechercher des produits d'une marque et d'une couleur spécifiques.Exemples
Les fonctions suivantes:
TOKEN("hello") TOKEN(["hello", "world"])
Générez les jetons suivants, respectivement:
[hello]
et[hello,world]
.La fonction suivante:
TOKENIZE_BOOL(true)
Génère le jeton suivant:
[y]
.Les tokenizeurs de nombres (
TOKENIZE_NUMBER
) permettent de générer un ensemble de jetons qui accélèrent les recherches de comparaison numérique. Pour les conditions d'égalité, le jeton est le nombre lui-même. Pour les conditions de plage (commerating >= 3.5
), l'ensemble de jetons est plus élaboré.Exemples
Les instructions de fonction suivantes:
TOKENIZE_NUMBER(42, comparison_type=>"equality") TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
Générez les jetons suivants, respectivement:
"==42"
et"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
Les fonctions de tokenisation sont généralement utilisées dans une expression de colonne générée. Ces colonnes sont définies comme HIDDEN
afin qu'elles ne soient pas incluses dans les résultats de la requête SELECT *
.
L'exemple suivant utilise un tokenizer de texte complet et un tokenizer numérique pour créer une base de données qui stocke les noms et les notes des albums musicaux. L'instruction DDL a deux fonctions:
- Définit les colonnes de données
AlbumTitle
etRating
. Définit
AlbumTitle_Tokens
etAlbumRating_Tokens
. Ces colonnesTOKENLIST
tokenizent les valeurs des colonnes de données afin que Spanner puisse les indexer.CREATE TABLE Albums ( AlbumId STRING(MAX) NOT NULL, AlbumTitle STRING(MAX), Rating FLOAT64, AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN, Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN ) PRIMARY KEY(AlbumId);
Chaque fois que les valeurs de base sont modifiées, AlbumTitle_Tokens
et Rating_Tokens
sont automatiquement mis à jour.
Tokeniser du texte brut ou du contenu HTML
La tokenisation de texte est compatible avec les types de contenu texte brut et HTML. Utilisez la fonction TOKENIZE_FULLTEXT
de Spanner pour créer des jetons. Utilisez ensuite l'instruction LDD CREATE SEARCH INDEX
pour générer l'index de recherche.
Par exemple, l'instruction LDD CREATE TABLE
suivante utilise la fonction TOKENIZE_FULLTEXT
pour créer des jetons à partir de AlbumTitles
dans la table Albums
. L'instruction LDD CREATE SEARCH INDEX
crée un indice de recherche avec le nouvel AlbumTitles_Tokens
.
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)
Le processus de tokenisation utilise les règles suivantes:
- La tokenisation n'inclut pas la racine des mots ni la correction des mots mal orthographiés. Par exemple, dans une phrase comme "Un chat regardait un groupe de chats", le jeton "chat" est indexé séparément du jeton "chats". Contrairement aux autres moteurs de recherche qui normalisent les jetons lors des écritures, Spanner offre la possibilité d'étendre la requête de recherche pour inclure différentes formes de mots. Pour en savoir plus, consultez la section Mode de requête amélioré.
- Les mots vides (comme "a") sont inclus dans l'index de recherche.
- La recherche en texte intégral n'est jamais sensible à la casse. Le processus de tokenisation convertit tous les jetons en minuscules.
Le processus de tokenisation suit les positions de chaque jeton dans le texte d'origine. Ces positions sont ensuite utilisées pour faire correspondre des expressions. Les positions sont stockées dans l'index de recherche avec les docids.
Google continue d'améliorer ses algorithmes de tokenisation. Dans certains cas, cela peut entraîner une tokenisation différente d'une chaîne à l'avenir par rapport à la façon dont elle est tokenisée actuellement. Nous nous attendons à ce que ce type de situation soit extrêmement rare. Par exemple, si la segmentation des langues chinoise, japonaise et coréenne (CJK) s'améliore.
L'argument content_type
spécifie si le format de contenu utilise du texte brut ou du code HTML. Utilisez les paramètres suivants pour définir content_type
:
- Pour la tokenisation du texte, définissez l'argument
content_type
sur "text/plain
". Il s'agit du paramètre par défaut. - Pour la tokenisation HTML, définissez l'argument
content_type
sur"text/html
. Sans cet argument, les balises HTML sont traitées comme des signes de ponctuation. En mode HTML, Spanner utilise des heuristiques pour inférer l'importance du texte sur la page. Par exemple, si le texte se trouve dans un titre ou sa taille de police. Les attributs acceptés pour le code HTML incluentsmall
,medium
,large
,title
et "link". Comme la position, l'attribut est stocké avec le jeton dans l'index de recherche. La tokenisation ne crée pas de jetons pour les balises HTML.
Les attributs de jeton n'ont aucune incidence sur la mise en correspondance ni sur les résultats de la fonction SEARCH
ou SEARCH_SUBSTRING
. Elles ne sont utilisées que pour le classement.
L'exemple suivant montre comment tokeniser du texte:
CREATE TABLE T (
...
Text STRING(MAX),
Html STRING(MAX),
Text_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
Html_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);
Amélioration de la détection de la langue avec l'argument language_tag
Par défaut, la tokenisation détecte automatiquement la langue de saisie. Lorsque la langue de saisie est connue, un argument language_tag
peut être utilisé pour affiner ce comportement:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
La plupart des applications ne spécifient pas l'argument language_tag
et s'appuient plutôt sur la détection automatique de la langue. La segmentation pour les langues asiatiques telles que le chinois, le coréen et le japonais ne nécessite pas de définir la langue de tokenisation.
Les exemples suivants montrent des cas où le language_tag
affecte la tokenisation:
Fonction de tokénisation | Jetons produits |
---|---|
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") |
[a, tout, pourquoi, il, ya, un, parce, que] |
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr" ) |
[a, tout, pourquoi, il, y, a, un, parce, que] |
TOKENIZE_FULLTEXT("旅 行") |
Deux jetons: [旅, 行] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Un seul jeton: [旅行] |
Étape suivante
- En savoir plus sur les index de recherche
- En savoir plus sur les index numériques
- En savoir plus sur le partitionnement d'index