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.
Présentation
La tokenisation est le processus de transformation des valeurs en jetons. La méthode que vous utiliser pour tokeniser un document détermine les types et l'efficacité des recherches que les utilisateurs peuvent y effectuer.
Spanner fournit des tokenizers pour le texte en langage naturel, les sous-chaînes, le texte verbatim, les nombres et les valeurs booléennes. Le schéma de base de données utilise tokenizer qui correspond au type de recherche requis pour la colonne. 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 la proéminence d'un jeton dans le document. Spanner utilise ces attributs pour l'évaluation afin de mettre en avant les termes plus importants (tels qu'un titre).
Analyseurs lexicaux
Spanner accepte les fonctions de tokenizer suivantes :
Le tokenizeur 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")
génèrent 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 est utilisé pour 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]
.Tokenizer N-gram (
TOKENIZE_NGRAMS
) génère des n-grammes à partir d'une entrée (sans la diviser en mots séparés). 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]
.Outil de tokenisation des nombres (
TOKENIZE_NUMBER
) sont utilisés pour générer un ensemble de jetons qui accélèrent la comparaison numérique des recherches. Pour les conditions d'égalité, le jeton est le nombre lui-même. Plage des conditions (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)
produire les jetons suivants, respectivement:
"==42"
et"==42"
."[1,75]"
,"[36, 45]"
,"[36,55]"
et"[36, 75]"
.
Les fonctions de tokenisation sont généralement utilisées
generated column. Ces
les colonnes sont définies en tant que HIDDEN
afin qu'elles ne soient pas incluses dans SELECT *
.
les résultats de la requête.
L'exemple suivant utilise une fonction de tokenisation de texte intégral et une fonction de tokenisation numérique pour créer une base de données qui stocke les noms et les notes des albums de musique. L'instruction LDD effectue deux actions:
- 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 le texte brut ou le contenu HTML
La tokenisation de texte est compatible avec les types de contenu texte brut et HTML. Utilisez les
Spanner TOKENIZE_FULLTEXT
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 le
TOKENIZE_FULLTEXT
pour créer des jetons à partir de AlbumTitles
dans
Albums
. L'instruction LDD CREATE SEARCH INDEX
crée une recherche
avec le nouveau 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 regarde groupe de chats, le jeton "chat" est indexé séparément du jeton "chats". Par rapport aux autres moteurs de recherche qui normalisent les jetons lors des écritures, Spanner permet d'étendre la requête de recherche à inclure différentes formes de mots. Pour en savoir plus, consultez Mode de requête amélioré.
- Les mots vides (tels que "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 l'original du texte. 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 les algorithmes de tokenisation. Dans certains cas, cela peut entraîner la tokenisation d'une chaîne différemment à l'avenir de la façon dont elle l'est. maintenant tokenisée. Nous nous attendons à ce que ce type de situation soit extrêmement rare. En voici un exemple : si des améliorations ont été apportées au chinois, au coréen et au japonais (CJK) la segmentation.
L'argument content_type
indique si le format de contenu utilise le format brut
texte ou 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 méthodes heuristiques pour déduire la proéminence 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". Tout comme la position, l'attribut est stocké en même temps que le dans l'index de recherche. La tokenisation ne crée pas de jetons pour les éléments HTML .
Les attributs de jeton n'ont aucune incidence sur la mise en correspondance ni sur les résultats de la méthode SEARCH
ou
fonction 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(...);
Affinement 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 d'entrée 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. Segmentation pour les langues asiatiques telles que le chinois,
Il n'est pas nécessaire de définir la langue de tokenisation pour le coréen et le japonais.
Les exemples suivants montrent des cas où language_tag
affecte la tokenisation:
Fonction de tokenisation | 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 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