Esta página descreve como adicionar a tokenização a tabelas. A tokenização é necessária para criar os tokens usados no índice da Pesquisa.
A tokenização é o processo de transformar 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 oferece tokenizadores para texto em linguagem natural, substrings, texto literal, números e booleanos. O esquema do banco de dados usa o tokenizador que corresponde ao tipo de pesquisa necessário para a coluna. Os tokenizadores 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 outras opções.
- O tokenizador gera uma
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].
Uma 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 textual.
- Ao tokenizar valores HTML, o Spanner gera atributos que indicam a importância de um token no documento. O Spanner usa esses atributos para pontuação, a fim de aumentar os termos mais importantes (como um título).
Tokenizadores
O Spanner oferece suporte às seguintes funções de tokenizador:
O tokenizador de texto completo (
TOKENIZE_FULLTEXT) produz tokens de palavras inteiras para consultas em linguagem natural.Exemplo
As duas funções a seguir
GoogleSQL
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")PostgreSQL
Este exemplo usa
spanner.tokenize_fulltext.spanner.tokenize_fulltext("Yellow apple") spanner.tokenize_fulltext('Yellow <b>apple</b>', context_type=>'text/html')produzem os mesmos tokens:
[yellow,apple].O tokenizador de substrings (
TOKENIZE_SUBSTRING) gera tokens para cada n-grama de cada palavra. Ele é usado para encontrar substrings de palavras em um texto.Exemplo
GoogleSQL
TOKENIZE_SUBSTRING('hello world', ngram_size_min=>4, ngram_size_max=>6)PostgreSQL
Este exemplo usa
spanner.tokenize_substring.spanner.tokenize_substring('hello world', ngram_size_min=>4, ngram_size_max=>6)Produz os seguintes tokens:
[ello,hell,hello,orld,worl,world].O tokenizador de n-gramas (
TOKENIZE_NGRAMS) gera n-gramas de uma entrada (sem dividi-la em palavras separadas). Ele é usado para acelerar predicados de expressão regular.Exemplo
A função a seguir:
GoogleSQL
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)PostgreSQL
Este exemplo usa
spanner.tokenize_ngrams.spanner.tokenize_ngrams('big time', ngram_size_min=>4, ngram_size_max=>4)Produz os seguintes tokens:
["Big ","ig T","g Ti"," Tim", "Time"].Os tokenizadores de correspondência exata (
TOKENeTOKENIZE_BOOL) são usados para procurar linhas que contêm um determinado valor em uma das 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 funções a seguir:
GoogleSQL
TOKEN("hello") TOKEN(["hello", "world"])PostgreSQL
Este exemplo usa
spanner.token.spanner.token('hello')Produz os seguintes tokens:
[hello].A função a seguir:
GoogleSQL
TOKENIZE_BOOL(true)PostgreSQL
Este exemplo usa
spanner.tokenize_bool.spanner.tokenize_bool(true)Produz o seguinte token:
[y].Os tokenizadores 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 próprio número. Para condições de intervalo (comorating >= 3.5), o conjunto de tokens é mais elaborado.Exemplos
As instruções de função a seguir:
GoogleSQL
TOKENIZE_NUMBER(42, comparison_type=>'equality') TOKENIZE_NUMBER(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)PostgreSQL
Este exemplo usa
spanner.tokenize_number.spanner.tokenize_number(42, comparison_type=>'equality') spanner.tokenize_number(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)Produzem os seguintes tokens, respectivamente:
"==42"e"==42","[1,75]","[36, 45]","[36,55]","[36, 75]".Os tokenizadores JSON e JSONB (
TOKENIZE_JSONeTOKENIZE_JSONB) são usados para gerar um conjunto de tokens que aceleram a igualdade JSON, a contenção e os predicados de existência de chave, comodoc.key = "value"oudoc[@key] IS NOT NULL(GoogleSQL) edoc->'key' = '"value"'::jsonboudoc ? 'key'(PostgreSQL).
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 tokenizador de texto completo e um tokenizador 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
AlbumTitleeRating. Define
AlbumTitle_TokenseAlbumRating_Tokens. Essas colunasTOKENLISTtokenizam os valores nas colunas de dados para que o Spanner possa indexá-los.GoogleSQL
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);PostgreSQL
CREATE TABLE albums ( albumid character varying NOT NULL, albumtitle character varying, albumtitle_Tokens spanner.tokenlist GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN, PRIMARY KEY(albumid));
Sempre que os valores de base são modificados, AlbumTitle_Tokens e Rating_Tokens são atualizados automaticamente.
Tokenizar texto simples ou conteúdo HTML
A tokenização de texto oferece suporte a tipos de conteúdo de texto simples e HTML. Use a função
TOKENIZE_FULLTEXT
do Spanner para criar tokens. Em seguida, use a
CREATE SEARCH INDEX
instrução DDL para gerar o índice da Pesquisa.
Por exemplo, a instrução DDL CREATE TABLE a seguir usa a função TOKENIZE_FULLTEXT para criar tokens de AlbumTitles na tabela Albums. A instrução DDL CREATE SEARCH INDEX cria um índice de pesquisa
com o novo AlbumTitles_Tokens.
GoogleSQL
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)
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL 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 lematização ou a correção de palavras com erros ortográficos. Por exemplo, em uma frase como "Um gato estava olhando para um grupo de gatos", o token "cat" é indexado separadamente do token "cats". Em comparação com outros mecanismos de pesquisa que normalizam tokens durante as gravações, o Spanner oferece uma opção para expandir a consulta de pesquisa e incluir diferentes formas de palavras. Para mais informações, consulte Modo de consulta aprimorado.
- As palavras sem relevância (como "a") são incluídas no índice da 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 acompanha as posições de cada token no texto original. Essas posições são usadas mais tarde para corresponder a frases. As posições são armazenadas no índice da Pesquisa junto com os docids.
O Google continua a melhorar os algoritmos de tokenização. Em alguns casos, isso pode levar a uma string a ser tokenizada de maneira diferente no futuro da forma como ela é tokenizada agora. Esperamos que esses casos sejam extremamente raros. Um exemplo disso é se houver uma melhoria na segmentação de idiomas chinês, japonês e coreano (CJK).
O argumento content_type especifica se o formato do conteúdo usa texto simples ou HTML. Use as configurações a seguir para definir o content_type:
- Para a tokenização de texto, defina o argumento
content_typecomo "text/plain". Essa é a configuração padrão. - Para a tokenização HTML, defina o argumento
content_typecomo"text/html". Sem esse argumento, as tags HTML são tratadas como pontuação. No modo HTML, o Spanner usa heurísticas para inferir a importância do texto na página. Por exemplo, se o texto está em um título ou no tamanho da fonte. Os atributos aceitos para HTML incluemsmall,medium,large,titlee `link'. Como a posição, o atributo é armazenado junto com o token no índice da Pesquisa. A tokenização não cria tokens para tags HTML.
Os atributos de token não afetam a correspondência nem os resultados da SEARCH ou
SEARCH_SUBSTRING função. Eles são usados apenas para
classificação.
O exemplo a seguir mostra como tokenizar texto:
GoogleSQL
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(...);
PostgreSQL
CREATE TABLE t (
...
text character varying,
html character varying,
text_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(text, content_type=>"text/plain")) VIRTUAL HIDDEN,
html_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(html, content_type=>'type/html')) VIRTUAL 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 é conhecido, um argumento language_tag pode ser usado para refinar esse comportamento:
GoogleSQL
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
PostgreSQL
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle, language_tag=>'en-us')) VIRTUAL HIDDEN
A maioria dos aplicativos deixa o argumento language_tag não especificado e, em vez disso, depende da 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 a 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 o particionamento de índices.