Trabalhe com analisadores de texto
A CREATE SEARCH INDEX
declaração DDL, a SEARCH
função e a TEXT_ANALYZE
função suportam opções de configuração avançadas do analisador de texto. Compreender os analisadores de texto do BigQuery e as respetivas opções permite-lhe refinar a sua experiência de pesquisa.
Este documento fornece uma vista geral dos diferentes analisadores de texto disponíveis no BigQuery e das respetivas opções de configuração, bem como exemplos de como os analisadores de texto funcionam com a pesquisa no BigQuery. Para mais informações sobre a sintaxe do analisador de texto, consulte o artigo Análise de texto.
Analisadores de texto
O BigQuery suporta os seguintes analisadores de texto:
NO_OP_ANALYZER
LOG_ANALYZER
PATTERN_ANALYZER
NO_OP_ANALYZER
Use o NO_OP_ANALYZER
quando tiver dados pré-processados que quer fazer corresponder exatamente. Não é aplicada nenhuma tokenização nem normalização ao texto. Uma vez que este analisador não realiza a tokenização nem a normalização, não aceita nenhuma configuração. Para mais informações sobre
NO_OP_ANALYZER
, consulte
NO_OP_ANALYZER
.
LOG_ANALYZER
O LOG_ANALYZER
modifica os dados das seguintes formas:
- O texto é convertido em minúsculas.
Os valores ASCII superiores a 127 são mantidos tal como estão.
O texto é dividido em termos individuais denominados tokens pelos seguintes delimitadores:
[ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \n \r \s \t %21 %26 %2526 %3B %3b %7C %7c %20 %2B %2b %3D %3d %2520 %5D %5d %5B %5b %3A %3a %0A %0a %2C %2c %28 %29
Se não quiser usar os delimitadores predefinidos, pode especificar os delimitadores que quer usar como opções do analisador de texto.
LOG_ANALYZER
permite-lhe configurar delimitadores específicos e filtros de tokens para ter mais controlo sobre os resultados da pesquisa. Para mais informações sobre as opções de configuração específicas disponíveis quando usa oLOG_ANALYZER
, consulte a opção do analisadordelimiters
e a opção do analisadortoken_filters
.
PATTERN_ANALYZER
O analisador de texto PATTERN_ANALYZER
extrai tokens do texto através de uma expressão regular. O motor e a sintaxe de expressões regulares usados com
PATTERN_ANALYZER
são RE2. PATTERN_ANALYZER
tokeniza padrões pela seguinte ordem:
- Encontra a primeira substring que corresponde ao padrão (da esquerda) na string. Este é um token a incluir no resultado.
- Remove tudo da string de entrada até ao final da substring encontrada no passo 1.
- Repete o processo até que a string esteja vazia.
A tabela seguinte apresenta exemplos de extração de tokens PATTERN_ANALYZER
:
Padrão | Texto de entrada | Símbolos de saída |
---|---|---|
ab | ababab |
|
ab | abacad |
|
[a-z]{2} | abacad |
|
aaa | aaaaa |
|
[a-z]/ | a/b/c/d/e |
|
/[^/]+/ | aa/bb/cc |
|
[0-9]+ | abc | |
(?:/?)[a-z] | /abc |
|
(?:/)[a-z] | /abc |
|
(?:[0-9]abc){3}(?:[a-z]000){2} | 7abc7abc7abcx000y000 |
|
".+" | "gatos" e "cães" |
Tenha em atenção que a utilização de quantificadores gananciosos + faz com que a correspondência corresponda à string mais longa possível no texto, o que faz com que "cats" e "dogs" sejam extraídos como um token no texto. |
".+?" | "gatos" e "cães" |
Tenha em atenção que a utilização de quantificadores preguiçosos +? faz com que a expressão regular corresponda à string mais curta possível no texto, o que faz com que "cats" e "dogs" sejam extraídos como 2 tokens separados no texto. |
A utilização do analisador de texto PATTERN_ANALYZER
dá-lhe mais controlo sobre os tokens extraídos de um texto quando usado com a função SEARCH
. A tabela
seguinte mostra como diferentes padrões e resultados geram diferentes SEARCH
resultados:
Padrão | Consulta | Texto | Tokens do texto | PESQUISAR(texto; consulta) | Explicação |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | 'abc' in ['abcghi'] |
cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' in ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' in ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERRO | Nenhuma correspondência encontrada no termo de consulta |
[0-9]+ | abc | abc123 | ERRO | Nenhuma correspondência encontrada no termo de consulta | |
[0-9]+ | `abc` | abc123 | ERRO | Nenhuma correspondência encontrada no termo de consulta A corresponder ao acento grave como acento grave e não como um caráter especial. |
|
[a-z][a-z0-9]*@google\.com | Este é o meu email: test@google.com | test@google.com |
|
TRUE | 'test@google.com' em 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | "abc" em ["abc"] Tenha em atenção que "abc abc" é uma única subconsulta(ou seja) depois de ser analisada pelo analisador de consultas de pesquisa, uma vez que o espaço tem carateres de escape. |
(?i)(?:Abc) (sem normalização) | aBcd | ABC |
|
FALSE | 'aBc' in ['Abc'] |
(?i)(?:Abc) normalization: lower_case = true |
aBcd | ABC |
|
TRUE | 'abc' in ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' in ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSE | 'abc' in ['/abc'] |
".+" | "cats" | "gatos" e "cães" |
|
FALSE | '"cats"' em ['"cats" and "dogs"] Tenha em atenção que a utilização de quantificadores gananciosos + faz com que a expressão regular corresponda à string mais longa possível no texto, o que faz com que '"cats" and "dogs"' seja extraído como um token no texto. |
".+?" | "cats" | "gatos" e "cães" |
|
TRUE | '"cats"' in ['"cats"', '"dogs"] Tenha em atenção que a utilização de quantificadores preguiçosos +? faz com que a expressão regular corresponda à string mais curta possível no texto, o que faz com que "cats" e "dogs" sejam extraídos como 2 tokens separados no texto. |
Exemplos
Os exemplos seguintes demonstram a utilização da análise de texto com opções de personalização para criar índices de pesquisa, extrair tokens e devolver resultados da pesquisa.
LOG_ANALYZER
com normalização de NFKC ICU e palavras vazias
O exemplo seguinte configura as opções LOG_ANALYZER
com a normalização NFKC ICU
e palavras irrelevantes. O exemplo pressupõe a seguinte tabela de dados com os dados já preenchidos:
CREATE TABLE dataset.data_table( text_data STRING );
Para criar um índice de pesquisa com a normalização ICU NFKC e uma lista de palavras vazias,
crie uma string formatada em JSON na opção analyzer_options
da declaração CREATE
SEARCH INDEX
DDL.
Para uma lista completa das opções disponíveis ao criar um índice de pesquisa com o comando LOG_ANALYZER
, consulte LOG_ANALYZER
.
Para este exemplo, as nossas palavras irrelevantes são "the", "of", "and", "for"
.
CREATE OR REPLACE SEARCH INDEX `my_index` ON `dataset.data_table`(ALL COLUMNS) OPTIONS( analyzer='PATTERN_ANALYZER', analyzer_options= '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''');
Tendo em conta o exemplo anterior, a tabela seguinte descreve a extração de tokens para vários valores de text_data
. Tenha em atenção que, neste documento, o caráter de duplo ponto de interrogação (⁇) foi escrito em itálico para diferenciar entre dois pontos de interrogação (??):
Texto de dados | Tokens para o índice | Explicação |
---|---|---|
The Quick Brown Fox | ["quick", "brown", "fox"] | A tokenização LOG_ANALYZER produz os tokens ["The", "Quick", "Brown", "Fox"]. Em seguida, a normalização da ICU com icu_case_folding = true letras minúsculas converte os tokens em ["the", "quick", "brown", "fox"]Por último, o filtro de palavras irrelevantes remove "the" da lista. |
The Ⓠuick Ⓑrown Ⓕox | ["quick", "brown", "fox"] | A tokenização LOG_ANALYZER produz os tokens ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]. Em seguida, a normalização NFKC ICU com icu_case_folding = true letras minúsculas nos tokens produz ["the", "quick", "brown", "fox"]Por último, o filtro de palavras irrelevantes remove "the" da lista. |
Ⓠuick⁇Ⓕox | ["quick??fox"] | A tokenização do LOG_ANALYZER produz os tokens ["The", "Ⓠuick⁇Ⓕox"]. Em seguida, a normalização de NFKC ICU com icu_case_folding = true converte os tokens em minúsculas para produzir ["quick??fox"]. Tenha em atenção que o Unicode de duplo ponto de interrogação foi normalizado em 2 carateres ASCII de ponto de interrogação.Por último, o filtro de palavras irrelevantes não faz nada porque nenhum dos tokens está na lista de filtros. |
Agora que o índice de pesquisa foi criado, pode usar a função SEARCH
para pesquisar a tabela usando as mesmas configurações do analisador especificadas no índice de pesquisa. Tenha em atenção que, se as configurações do analisador na função SEARCH
não corresponderem às do índice de pesquisa, o índice de pesquisa não é usado. Use a seguinte consulta:
SELECT SEARCH( analyzer => 'LOG_ANALYZER', analyzer_options => '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''')
Substitua o seguinte:
search_query
: o texto que quer pesquisar.
A tabela seguinte demonstra vários resultados com base em diferentes textos de pesquisa e diferentes valores de search_query
:
text_data | search_query |
Resultado | Explicação |
---|---|---|---|
The Quick Brown Fox | "Ⓠuick" |
TRUE |
A lista final de tokens extraídos
do texto é ["rápida", "castanha", "raposa"]. A lista final de tokens extraídos da consulta de texto é ["quick"]. Pode encontrar todos os tokens de consulta de listas nos tokens de texto. |
The Ⓠuick Ⓑrown Ⓕox | "quick" |
TRUE |
A lista final de tokens extraídos do texto é ["quick", "brown", "fox"]. A lista final de tokens extraídos da consulta de texto é ["quick"]. Pode encontrar todos os tokens de consulta de listas nos tokens de texto. |
Ⓠuick⁇Ⓕox | "quick" |
FALSE |
A lista final de tokens extraídos do texto é ["quick??fox"]. A lista final de tokens extraídos da consulta de texto é ["quick"]. "quick" não está na lista de tokens do texto. |
Ⓠuick⁇Ⓕox | "quick⁇fox" |
TRUE |
A lista final de tokens extraídos do texto é ["quick??fox"]. A lista final de tokens extraídos da consulta de texto é ["quick??fox"]. "quick??fox" está na lista de tokens do texto. |
Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
Em LOG_ANALYZER , o acento grave requer uma correspondência exata de texto. |
PATTERN_ANALYZER
para pesquisa de IPv4 com palavras irrelevantes
O exemplo seguinte configura o analisador de texto PATTERN_ANALYZER
para pesquisar um padrão específico enquanto filtra determinadas palavras vazias. Neste exemplo, o padrão corresponde a um endereço IPv4 e ignora o valor localhost (127.0.0.1
).
Este exemplo pressupõe que a seguinte tabela está preenchida com dados:
CREATE TABLE dataset.data_table( text_data STRING );
Para criar um índice de pesquisa, a opção pattern
e uma lista de palavras vazias, crie uma string formatada em JSON na opção analyzer_options
da declaração CREATE SEARCH
INDEX
DDL.
Para uma lista completa das opções disponíveis ao criar um índice de pesquisa com o comando PATTERN_ANALYZER
, consulte PATTERN_ANALYZER
.
Para este exemplo, as nossas palavras de exclusão são o endereço localhost,
127.0.0.1
.
CREATE SEARCH INDEX my_index ON dataset.data_table(text_data) OPTIONS (analyzer = 'PATTERN_ANALYZER', analyzer_options = '''{ "patterns": [ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ], "token_filters": [ { "stop_words": [ "127.0.0.1" ] } ] }''' );
Quando usar expressões regulares com analyzer_options
, inclua três símbolos \
iniciais para escapar corretamente às expressões regulares que incluem um símbolo \
, como \d
ou \b
.
A tabela seguinte descreve as opções de tokenização para vários valores de text_data
Texto de dados | Tokens para o índice | Explicação |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | Os padrões IPv4 capturam os endereços IPv4, mesmo que não haja um espaço entre o endereço e o texto. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | "127.0.0.1" é filtrado porque está na lista de palavras irrelevantes. |
Agora que o índice de pesquisa foi criado, pode usar a função SEARCH
para pesquisar a tabela com base na tokenização especificada em analyzer_options
. Use a seguinte consulta:
SELECT SEARCH(dataset.data_table.text_data "search_data", analyzer => 'PATTERN_ANALYZER', analyzer_options => '''{ "patterns": [ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ], "token_filters": [ { "stop_words": [ "127.0.0.1" ] } ] }''' );
Substitua o seguinte:
search_query
: o texto que quer pesquisar.
A tabela seguinte demonstra vários resultados com base em diferentes textos de pesquisa e diferentes valores de search_query
:
text_data | search_query |
Resultado | Explicação |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERRO | Nenhum token de pesquisa na consulta. A consulta passa pelo analisador de texto, que filtra o token "127.0.0.1". |
abc192.168.1.1def 172.217.20.142 | "192.168.1.1abc" | TRUE | A lista de tokens extraídos da consulta é ["192.168.1.1"]. A lista de tokens extraídos do texto é ["192.168.1.1", "172.217.20.142"]. |
abc192.168.1.1def 172.217.20.142 | "`192.168.1.1`" | TRUE | A lista de tokens extraídos da consulta é ["192.168.1.1"]. A lista de tokens extraídos do texto é ["192.168.1.1", "172.217.20.142"]. Tenha em atenção que os acentos graves são tratados como carateres normais para o PATTERN_ANALYZER. |
O que se segue?
- Para uma vista geral dos exemplos de utilização, dos preços, das autorizações necessárias e das limitações do índice de pesquisa, consulte a Introdução à pesquisa no BigQuery.
- Para obter informações sobre a pesquisa eficiente de colunas indexadas, consulte o artigo Pesquise com um índice.