Trabalhe com analisadores de texto

A CREATE SEARCH INDEXdeclaração DDL, a SEARCHfunção e a TEXT_ANALYZEfunçã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 o LOG_ANALYZER, consulte a opção do analisador delimiters e a opção do analisador token_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:

  1. Encontra a primeira substring que corresponde ao padrão (da esquerda) na string. Este é um token a incluir no resultado.
  2. Remove tudo da string de entrada até ao final da substring encontrada no passo 1.
  3. 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
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • ac
  • anúncio
aaa aaaaa
  • aaa
[a-z]/ a/b/c/d/e
  • a/
  • b/
  • c/
  • d/
/[^/]+/ aa/bb/cc
  • /bb/
[0-9]+ abc
(?:/?)[a-z] /abc
  • /abc
(?:/)[a-z] /abc
  • /abc
(?:[0-9]abc){3}(?:[a-z]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
".+" "gatos" e "cães"
  • "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"
  • "cats"
  • "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
  • abcghi
TRUE 'abc' in ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FALSE 'cde' in ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' in ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
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
  • test@google.com
TRUE 'test@google.com' em 'test@google.com'
abc 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
  • ABC
FALSE 'aBc' in ['Abc']
(?i)(?:Abc)

normalization:
lower_case = true
aBcd ABC
  • abc
TRUE 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' in ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE 'abc' in ['/abc']
".+" "cats" "gatos" e "cães"
  • "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"
  • "cats"
  • "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 "quickfox" 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 "`quickfox`" 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.