Questa pagina descrive come aggiungere la tokenizzazione alle tabelle. La tokenizzazione è necessaria per creare i token utilizzati nell'indice di ricerca.
Panoramica
La tokenizzazione è il processo di trasformazione dei valori in token. Il metodo la tokenizzazione di un documento determina i tipi e l'efficienza delle ricerche che gli utenti possono eseguire.
Spanner fornisce tokenizzatori per il testo in linguaggio naturale, sottostringhe, testo, numeri e valori booleani. Lo schema del database utilizza il tokenizzatore che corrisponda al tipo di ricerca necessario per la colonna. Tokenizzatori presentano le seguenti caratteristiche:
- Ogni tokenizzatore è una funzione SQL che riceve un input, ad esempio una stringa o un numero e argomenti con nome per le opzioni aggiuntive.
- Il tokenizzatore restituisce un valore
TOKENLIST
.
Ad esempio, una stringa di testo The quick brown fox jumps over the lazy dog
è tokenizzato in [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
Una stringa HTML The <b>apple</b> is <i>red</i>
è 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 si tokenizza i valori HTML, Spanner genera attributi. che indicano l'evidenza di un token all'interno del documento. Spanner usa questi attributi per assegnare punteggi al fine di aumentare termini in evidenza (come un titolo).
Tokenizzatori
Spanner supporta le seguenti funzioni di tokenizzatore:
Il tokenizzatore di 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 di espressione regolare.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 i seguenti token, rispettivamente:
[hello]
e[hello,world]
.La seguente funzione:
TOKENIZE_BOOL(true)
Genera il seguente token:
[y]
.Numero di tokenizzatori (
TOKENIZE_NUMBER
) vengono utilizzati per generare un insieme di token che accelerano il confronto numerico ricerche. 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 i seguenti token, rispettivamente:
"==42"
e"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
Le funzioni di tokenizzazione vengono solitamente utilizzate in un'espressione di
colonna generata. Questi
le colonne sono definite HIDDEN
e non vengono quindi incluse in SELECT *
i risultati della query.
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
. QuestiTOKENLIST
tokenizzare i valori nelle colonne di dati in modo che Spanner può indicizzarle.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 vengono modificati i valori di base, AlbumTitle_Tokens
e Rating_Tokens
vengono aggiornati automaticamente.
Tokenizza testo normale o contenuti HTML
La tokenizzazione del testo supporta i tipi di contenuti in testo normale e HTML. Utilizza la
Spanner TOKENIZE_FULLTEXT
per creare i token. Quindi, utilizza l'istruzione DDL
CREATE SEARCH INDEX
per generare l'indice di ricerca.
Ad esempio, la seguente istruzione DDL CREATE TABLE
utilizza il metodo
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)
La procedura di tokenizzazione utilizza le seguenti regole:
- La tokenizzazione non include la radiazione o la correzione di 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 includono diverse forme di parole. Per ulteriori informazioni, vedi Modalità di query avanzata.
- Le stopword (come "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 monitora le posizioni di ciascun token nell'originale testo. Queste posizioni vengono successivamente utilizzate per trovare corrispondenze con le frasi. Le posizioni sono memorizzate nell'indice di ricerca insieme ai documenti.
Google continua a migliorare gli algoritmi di tokenizzazione. In alcuni casi, questa operazione far sì che una stringa venga tokenizzata in modo diverso in futuro rispetto a quanto avviene tokenizzato ora. Prevediamo che questi casi siano estremamente rari. Un esempio è in caso di miglioramento della lingua cinese, giapponese e coreano (CJK) la segmentazione dei clienti.
L'argomento content_type
specifica se il formato dei contenuti utilizza il formato normale
testo 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 l'euristica per dedurre il grado di evidenza del testo della 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
. Servono esclusivamente per
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
un linguaggio di input è noto, è possibile usare 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.
I seguenti esempi mostrano 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: [旅, CLICKS] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Un token: [旅行] |
Passaggi successivi
- Scopri di più sugli indici di ricerca.
- Ulteriori informazioni sugli indici numerici.
- Scopri di più sul partizionamento degli indici.