Questa pagina descrive come aggiungere la tokenizzazione alle tabelle. La tokenizzazione è necessaria per creare i token utilizzati nell'indice di ricerca.
La tokenizzazione è il processo di trasformazione dei valori in token. Il metodo utilizzato per tokenizzare un documento determina i tipi e l'efficienza delle ricerche che gli utenti possono eseguire.
Spanner fornisce strumenti di tokenizzazione per testo in linguaggio naturale, sottostringhe, testo verbatim, numeri e valori booleani. Lo schema del database utilizza il tokenizer corrispondente al tipo di ricerca necessario per la colonna. I tokenizzatori hanno le seguenti caratteristiche:
- Ogni tokenizzatore è una funzione SQL che riceve un input, ad esempio una stringa o un numero, e argomenti con nome per opzioni aggiuntive.
- Il tokenizzatore restituisce un
TOKENLIST
.
Ad esempio, una stringa di testo The quick brown fox jumps over the lazy dog
viene tokenizzata in [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
Una stringa HTML The <b>apple</b> is <i>red</i>
viene tokenizzata in
[the,apple,is,red]
.
I token hanno le seguenti caratteristiche:
- I token vengono archiviati in colonne che utilizzano il tipo di dati
TOKENLIST
. - Ogni token viene archiviato come sequenza di byte, con un insieme facoltativo di attributi associati. Ad esempio, nelle applicazioni di testo completo, un token è tipicamente una singola parola di un documento di testo.
- Quando esegue la tokenizzazione dei valori HTML, Spanner genera attributi che indicano l'importanza di un token all'interno del documento. Spanner utilizza questi attributi per il calcolo del punteggio al fine di dare risalto ai termini più importanti (ad esempio un'intestazione).
Tokenizzatori
Spanner supporta le seguenti funzioni di tokenizzazione:
Il tokenizzatore del testo integrale (
TOKENIZE_FULLTEXT
) produce token di parole intere per le query in linguaggio naturale.Esempio
Entrambe le seguenti funzioni
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
producono gli stessi token:
[yellow,apple]
.Lo strumento di tokenizzazione delle sottostringhe (
TOKENIZE_SUBSTRING
) genera token per ogni n-gramma di ogni parola. Viene utilizzato per trovare sottostringhe di parole in un testo.Esempio
TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
Produce i seguenti token:
[ello,hell,hello,orld,worl,world]
.Il tokenizzatore di n-grammi (
TOKENIZE_NGRAMS
) genera n-grammi da un input (senza dividerli in parole separate). Viene utilizzato per accelerare i predicati delle espressioni regolari.Esempio
La seguente funzione:
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
Produce i seguenti token:
["Big ","ig T","g Ti"," Tim", "Time"]
.I tokenizzatori a corrispondenza esatta (
TOKEN
eTOKENIZE_BOOL
) vengono utilizzati per cercare le righe contenenti un determinato valore in una delle loro colonne. Ad esempio, un'applicazione che indicizza un catalogo di prodotti potrebbe voler cercare i prodotti di un determinato brand e colore.Esempi
Le seguenti funzioni:
TOKEN("hello") TOKEN(["hello", "world"])
Produci rispettivamente i seguenti token:
[hello]
e[hello,world]
.La seguente funzione:
TOKENIZE_BOOL(true)
Produce il seguente token:
[y]
.I tokenizzatori di numeri (
TOKENIZE_NUMBER
) vengono utilizzati per generare un insieme di token che accelerano le ricerche di confronto numerico. Per le condizioni di uguaglianza, il token è il numero stesso. Per le condizioni di intervallo (ad es.rating >= 3.5
), l'insieme di token è più elaborato.Esempi
Le seguenti istruzioni di funzione:
TOKENIZE_NUMBER(42, comparison_type=>"equality") TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
Produci rispettivamente i seguenti token:
"==42"
e"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
Le funzioni di tokenizzazione vengono solitamente utilizzate in un'espressione di
colonna generata. Queste colonne sono definite come HIDDEN
in modo che non vengano incluse nei risultati della query SELECT *
.
L'esempio seguente utilizza un tokenizzatore di testo completo e un tokenizzatore numerico per creare un database che memorizza i nomi e le valutazioni degli album musicali. L'istruzione DDL esegue due operazioni:
- Definisce le colonne di dati
AlbumTitle
eRating
. Definisce
AlbumTitle_Tokens
eAlbumRating_Tokens
. QuesteTOKENLIST
colonne tokenizzano i valori nelle colonne di dati in modo che Spanner possa indicizzarli.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);
Ogni volta che i valori di base vengono modificati, AlbumTitle_Tokens
e Rating_Tokens
vengono aggiornati automaticamente.
Tokenizzare i contenuti in testo normale o HTML
La tokenizzazione del testo supporta i tipi di contenuti di testo normale e HTML. Utilizza la funzione TOKENIZE_FULLTEXT
di Spanner per creare token. Quindi, utilizza l'istruzione DDL
CREATE SEARCH INDEX
per generare l'indice di ricerca.
Ad esempio, la seguente istruzione DDL CREATE TABLE
utilizza la funzione TOKENIZE_FULLTEXT
per creare token da AlbumTitles
nella tabella Albums
. L'istruzione DDL CREATE SEARCH INDEX
crea un indice di ricerca con il nuovo 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)
Il processo di tokenizzazione utilizza le seguenti regole:
- La tokenizzazione non include stemming o correzione di parole con errori ortografici. Ad esempio, in una frase come "Un gatto guardava un gruppo di gatti", il token "gatto" viene indicizzato separatamente dal token "gatti". Rispetto ad altri motori di ricerca che normalizzano i token durante le scritture, Spanner offre un'opzione per espandere la query di ricerca in modo da includere forme diverse di parole. Per ulteriori informazioni, consulta Modalità di query avanzata.
- Le parole comuni (ad es. "a") sono incluse nell'indice di ricerca.
- La ricerca a testo intero è sempre insensibile alle maiuscole. Il processo di tokenizzazione converte tutti i token in minuscolo.
Il processo di tokenizzazione tiene traccia delle posizioni di ciascun token nel testo originale. Queste posizioni vengono successivamente utilizzate per trovare le corrispondenze con le frasi. Le posizioni vengono memorizzate nell'indice di ricerca insieme ai docid.
Google continua a migliorare gli algoritmi di tokenizzazione. In alcuni casi, questo potrebbe portare alla tokenizzazione di una stringa in modo diverso in futuro rispetto a come avviene ora. Prevediamo che questi casi siano estremamente rari. Un esempio è rappresentato da un miglioramento della segmentazione in base alla lingua per cinese, giapponese e coreano (CJK).
L'argomento content_type
specifica se il formato dei contenuti utilizza testo normale o HTML. Utilizza le seguenti impostazioni per impostare content_type
:
- Per la tokenizzazione del testo, imposta l'argomento
content_type
su "text/plain
". Si tratta dell'impostazione predefinita. - Per la tokenizzazione HTML, imposta l'argomento
content_type
su"text/html
". Senza questo argomento, i tag HTML vengono trattati come punteggiatura. In modalità HTML, Spanner utilizza le heurismi per dedurre l'importanza del testo sulla pagina. Ad esempio, se il testo si trova in un'intestazione o le dimensioni del carattere. Gli attributi supportati per HTML includonosmall
,medium
,large
,title
e "link". Come la posizione, l'attributo viene memorizzato insieme al token nell'indice di ricerca. La tokenizzazione non crea token per i tag HTML.
Gli attributi dei token non influiscono sulla corrispondenza o sui risultati della funzione SEARCH
o
SEARCH_SUBSTRING
. Vengono utilizzati solo per il
ranking.
L'esempio seguente mostra come tokenizzare il testo:
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(...);
Raffinamento del rilevamento della lingua con l'argomento language_tag
Per impostazione predefinita, la tokenizzazione rileva automaticamente la lingua di input. Quando la lingua di input è nota, è possibile utilizzare un argomento language_tag
per perfezionare questo comportamento:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
La maggior parte delle applicazioni lascia l'argomento language_tag
non specificato e si basa invece sul rilevamento automatico della lingua. La segmentazione per le lingue asiatiche come cinese, coreano e giapponese non richiede l'impostazione della lingua di tokenizzazione.
Gli esempi seguenti mostrano i casi in cui language_tag
influisce sulla tokenizzazione:
Funzione di tokenizzazione | Token prodotti |
---|---|
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("旅 行") |
Due token: [旅, 行] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Un token: [旅行] |
Passaggi successivi
- Scopri di più sugli indici di ricerca.
- Scopri di più sugli indici numerici.
- Scopri di più sul partizionamento degli indici.