Esta página descreve como adicionar a tokenização a tabelas. Tokenização é necessário para criar os tokens que são usados índice de pesquisa.
Visão geral
A tokenização é o processo de transformação de valores em tokens. O método usado para tokenizar um documento determina os tipos e a eficiência das pesquisas que os usuários podem realizar nele.
O Spanner fornece tokenizers para texto em linguagem natural, substrings, texto literal, números e booleanos. O esquema do banco de dados usa tokenizador que corresponde ao tipo de pesquisa necessária para a coluna. Os tokenizers têm as seguintes características:
- Cada tokenizador é uma função SQL que recebe uma entrada, como uma string ou um número e argumentos nomeados para opções adicionais.
- O tokenizer gera um
TOKENLIST
.
Por exemplo, uma string de texto The quick brown fox jumps over the lazy dog
é tokenizada em [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
A string HTML The <b>apple</b> is <i>red</i>
é tokenizada em
[the,apple,is,red]
.
Os tokens têm as seguintes características:
- Os tokens são armazenados em colunas que usam o tipo de dados
TOKENLIST
. - Cada token é armazenado como uma sequência de bytes, com um conjunto opcional de atributos associados. Por exemplo, em aplicativos de texto completo, um token é normalmente uma única palavra de um documento de texto.
- Ao tokenizar valores HTML, o Spanner gera atributos que indicam o destaque de um token no documento. O Spanner usa esses atributos para pontuação para aumentar termos mais importantes (como um título).
Tokenizadores
O Spanner é compatível com as seguintes funções de tokenizador:
O tokenizer de texto completo (
TOKENIZE_FULLTEXT
) produz tokens de palavras inteiras para consultas de linguagem natural.Exemplo
Ambas as funções a seguir
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
produzem os mesmos tokens:
[yellow,apple]
.Tokenizador de substring (
TOKENIZE_SUBSTRING
) gera tokens para cada n-grama de cada palavra. Ele é usado para encontrar substrings de palavras em um texto.Exemplo
TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
Produz os seguintes tokens:
[ello,hell,hello,orld,worl,world]
.Tokenizador de n-gramas (
TOKENIZE_NGRAMS
) gera n-gramas de uma entrada (sem dividi-la em palavras separadas). Ele é usado para acelerar os predicados de expressão regular.Exemplo
A função a seguir:
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
Produz os seguintes tokens:
["Big ","ig T","g Ti"," Tim", "Time"]
.Tokenizers de correspondência exata (
TOKEN
) eTOKENIZE_BOOL
). são usados para procurar linhas contendo um determinado valor em uma de suas colunas. Por exemplo, um aplicativo que indexa um catálogo de produtos pode querer pesquisar produtos de uma marca e cor específicas.Exemplos
As seguintes funções:
TOKEN("hello") TOKEN(["hello", "world"])
Produza os seguintes tokens, respectivamente:
[hello]
e[hello,world]
.A função a seguir:
TOKENIZE_BOOL(true)
Produz o seguinte token:
[y]
.Os tokenizers de números (
TOKENIZE_NUMBER
) são usados para gerar um conjunto de tokens que aceleram as pesquisas de comparação numérica. Para condições de igualdade, o token é o número em si. Para condições de intervalo (comorating >= 3.5
), o conjunto de tokens é mais elaborado.Exemplos
As seguintes declarações de função:
TOKENIZE_NUMBER(42, comparison_type=>"equality") TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
Produza os seguintes tokens, respectivamente:
"==42"
e"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
As funções de tokenização geralmente são usadas em uma expressão de coluna gerada. Essas
colunas são definidas como HIDDEN
para que não sejam incluídas nos resultados da consulta
SELECT *
.
O exemplo a seguir usa um tokenizer de texto completo e um tokenizer numérico para criar um banco de dados que armazena nomes e classificações de álbuns de música. A instrução DDL faz duas coisas:
- Define as colunas de dados
AlbumTitle
eRating
. Define
AlbumTitle_Tokens
eAlbumRating_Tokens
. EssesTOKENLIST
as colunas tokenizam os valores nas colunas de dados para que o Spanner pode indexá-las.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);
Sempre que os valores base forem modificados, AlbumTitle_Tokens
e Rating_Tokens
são atualizadas automaticamente.
Tokenizar conteúdo de texto simples ou HTML
A tokenização de texto oferece suporte aos tipos de conteúdo de texto simples e HTML. Use o
Spanner TOKENIZE_FULLTEXT
para criar tokens. Em seguida, use a instrução DDL
CREATE SEARCH INDEX
para gerar o índice de pesquisa.
Por exemplo, a instrução DDL CREATE TABLE
a seguir usa as
TOKENIZE_FULLTEXT
para criar tokens a partir de AlbumTitles
no
Albums
. A instrução DDL CREATE SEARCH INDEX
cria um índice de pesquisa
com o novo 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)
O processo de tokenização usa as seguintes regras:
- A tokenização não inclui stemming ou correção de erros ortográficos. Por exemplo, em uma frase como "Um gato estava olhando para um grupo de gatos", o token "gato" é indexado separadamente do token "cats". Em comparação com outros mecanismos de pesquisa que normalizam tokens durante gravações, O Spanner oferece uma opção para expandir a consulta de pesquisa para incluir diferentes formas de palavras. Para mais informações, consulte Modo de consulta aprimorada.
- As palavras-chave (como "a") são incluídas no índice de pesquisa.
- A pesquisa de texto completo não diferencia maiúsculas de minúsculas. O processo de tokenização converte todos os tokens em letras minúsculas.
O processo de tokenização rastreia as posições de cada token na organização em textos. Essas posições são usadas mais tarde para corresponder a frases. As posições são armazenadas no índice de pesquisa com os ids de documento.
O Google continua a aprimorar os algoritmos de tokenização. Em alguns casos, isso pode fazer com que uma string seja tokenizada de maneira diferente no futuro em relação à forma como ela é tokenizada agora. Esperamos que esses casos sejam extremamente raros. Um exemplo disso é se houver uma melhoria na segmentação de idioma chinês, japonês e coreano (CJK, na sigla em inglês).
O argumento content_type
especifica se o formato do conteúdo usa formatação
como texto ou HTML. Use as seguintes configurações para definir content_type
:
- Para a tokenização de texto, defina o argumento
content_type
como "text/plain
". Essa é a configuração padrão. - Para tokenização HTML, defina o argumento
content_type
como"text/html
. Sem esse argumento, as tags HTML são tratadas como pontuação. No modo HTML, O Spanner usa heurística para inferir o nível de destaque do texto da página. Por exemplo, se o texto está em um cabeçalho ou no tamanho da fonte. Os atributos compatíveis com HTML incluemsmall
,medium
,large
,title
e `link'. Assim como a posição, o atributo é armazenado com o token no índice de pesquisa. A tokenização não cria tokens para tags HTML.
Os atributos de token não afetam a correspondência nem os resultados de SEARCH
ou
função SEARCH_SUBSTRING
. Elas são usadas apenas para
classificação.
O exemplo a seguir mostra como tokenizar texto:
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(...);
Refinamento da detecção de idioma com o argumento language_tag
A tokenização detecta o idioma de entrada automaticamente por padrão. Quando o
idioma de entrada for conhecido, um argumento language_tag
poderá ser usado para
refine esse comportamento:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
A maioria dos aplicativos deixa o argumento language_tag
não especificado e depende
detecção automática de idioma. A segmentação para idiomas asiáticos, como chinês,
coreano e japonês, não exige a definição do idioma de tokenização.
Os exemplos a seguir mostram casos em que language_tag
afeta a tokenização:
Função de tokenização | Tokens produzidos |
---|---|
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("旅 行") |
Dois tokens: [旅, 行] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Um token: [旅分] |
A seguir
- Saiba mais sobre índices de pesquisa.
- Saiba mais sobre índices numéricos.
- Saiba mais sobre a partição de índices.