Lavorare con gli analizzatori di testo

Il DDL CREATE SEARCH INDEX l'Informativa, funzione SEARCH e TEXT_ANALYZE funzione supportare opzioni di configurazione avanzate per l'analizzatore di testo. Comprensione Gli analizzatori di testo di BigQuery e le loro opzioni ti consentono di perfezionare la ricerca un'esperienza senza intervento manuale.

Questo documento fornisce una panoramica dei diversi analizzatori di testo disponibili in BigQuery e le relative opzioni di configurazione, oltre a esempi come funzionano gli analizzatori di testo con la ricerca in in BigQuery. Per ulteriori informazioni sulla sintassi dello strumento di analisi del testo, consulta Analisi del testo.

Analizzatori di testo

BigQuery supporta i seguenti analizzatori di testo:

  • NO_OP_ANALYZER
  • LOG_ANALYZER
  • PATTERN_ANALYZER

NO_OP_ANALYZER

Utilizza NO_OP_ANALYZER se disponi di dati pre-elaborati che vuoi abbinare in modo esatto. Non viene applicata alcuna tokenizzazione o normalizzazione al testo. Dal giorno questo analizzatore non esegue la tokenizzazione o la normalizzazione, non accetta configurazione. Per ulteriori informazioni NO_OP_ANALYZER, vedi NO_OP_ANALYZER,

LOG_ANALYZER

L'LOG_ANALYZER modifica i dati nei seguenti modi:

  • Il testo è scritto in minuscolo.
  • I valori ASCII superiori a 127 vengono mantenuti così come sono.

  • Il testo è suddiviso in singoli termini chiamati token dai seguenti termini delimitatori:

    [ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \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 non vuoi utilizzare i delimitatori predefiniti, puoi specificare delimitatori da utilizzare come opzioni di analisi del testo. LOG_ANALYZER ti consente di configurare delimitatori specifici e filtri dei token per avere un maggiore controllo sui risultati di ricerca. Per ulteriori informazioni sui specifiche opzioni di configurazione disponibili quando utilizzi LOG_ANALYZER, consulta Analizzatore delimiters e token_filters analizzatore l'opzione.

PATTERN_ANALYZER

L'analizzatore di testo PATTERN_ANALYZER estrae i token dal testo utilizzando una un'espressione di base. Il motore delle espressioni regolari e la sintassi utilizzati con PATTERN_ANALYZER è RE2. PATTERN_ANALYZER tokenizza i pattern nel seguente ordine:

  1. Trova la prima sottostringa che corrisponde al pattern (da sinistra) nella stringa. Si tratta di un token da includere nell'output.
  2. Rimuove tutto dalla stringa di input fino alla fine della sottostringa indicata nel passaggio 1.
  3. Il processo viene ripetuto finché la stringa non è vuota.

La tabella seguente fornisce esempi di estrazione di token di PATTERN_ANALYZER:

Pattern Testo di input Token di output
addominali Abbab
  • addominali
addominali abacad
  • addominali
[a-z]{2} abacad
  • addominali
  • ac
  • annuncio
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
".+" "gatti" e "cani"
  • "gatti" e "cani"


Nota che l'uso di quantificatori greedy + consente di trovare la stringa più lunga possibile nel testo, causando la frase "cats" e "dogs" estrarre come token nel testo.
".+?" "gatti" e "cani"
  • "gatti"
  • "cani"


Tieni presente che l'utilizzo di quantificatori lazy +? rende l'espressione regolare corrispondente alla stringa più breve possibile nel testo, causando "gatti", "cani"" da estrarre come 2 token separati nel testo.

L'analizzatore di testo PATTERN_ANALYZER offre un maggiore controllo sulle di testo estratti da un testo quando utilizzati con SEARCH . Le seguenti mostra in che modo pattern e risultati diversi generano SEARCH risultati:

Pattern Query Testo Token da testo SEARCH(testo; query) Spiegazione
abc abcdef abcghi
  • abcghi
VERO "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/
VERO "a/" in ['a/', "b/', 'c/', 'd/'] E "b/" in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
VERO "/bb/" tra ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
ERRORE Nessuna corrispondenza trovata nel termine di ricerca
[0-9]+ abc abc123 ERRORE Nessuna corrispondenza trovata nel termine di ricerca
[0-9]+ "abc" abc123 ERRORE Nessuna corrispondenza trovata nel termine di ricerca

L'accento grave corrisponde all'accento grave, non a un carattere speciale.
[a-z][a-z0-9]*@google\.com Questo è il mio indirizzo email: test@google.com test@google.com
  • test@google.com
VERO "test@google.com" in "test@google.com"
abc abc\ abc abc
  • abc
VERO "abc" in ['abc']

Tieni presente che "abc abc" è una singola sottoquery analizzata dall'analizzatore sintattico delle query di ricerca perché lo spazio contiene caratteri di escape.
(?i)(?:Abc) (nessuna normalizzazione) aBcd ABC
  • ABC
FALSE "aBc" tra ["Abc"]
(?i)(?:Abc)

normalizzazione:
minuscolo = vero
aBcd ABC
  • abc
VERO "abc" in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
VERO "/abc" tra ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE "abc" tra ['/abc']
".+" "gatti" "gatti" e "cani"
  • "gatti" e "cani"
FALSE "gatti" in ['"gatti" e "cani"]

Nota: l'utilizzo di quantificatori greedy + consente all'espressione regolare di trovare la stringa più lunga possibile nel testo, causando la frase "cats" e "dogs" estrarre come token nel testo.
".+?" "gatti" "gatti" e "cani"
  • "gatti"
  • "cani"
VERO "gatti" in ['"gatti"', '"cani"]

Tieni presente che l'utilizzo di quantificatori lazy +? rende l'espressione regolare corrispondente alla stringa più breve possibile nel testo, causando "gatti", "cani"" da estrarre come 2 token separati nel testo.

Esempi

I seguenti esempi dimostrano l'uso dell'analisi del testo con opzioni di personalizzazione per creare indici di ricerca, estrarre token e restituire risultati di ricerca.

LOG_ANALYZER con normalizzazione e stop word NFKC per ICU.

L'esempio seguente configura le opzioni LOG_ANALYZER con NFKC ICU di normalizzazione e di stop. L'esempio presuppone che la seguente tabella di dati con dati già compilati:

CREATE TABLE dataset.data_table(
  text_data STRING
);

Per creare un indice di ricerca con la normalizzazione di NFKC ICU e un elenco di parole di stop, crea una stringa in formato JSON nell'opzione analyzer_options del DDL CREATE SEARCH INDEX Informativa. Per un elenco completo delle opzioni disponibili durante la creazione di un indice di ricerca con LOG_ANALYZER, vedi LOG_ANALYZER, Per questo esempio, le nostre parole di stop sono "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"] }
    ]
  }''');

Dato l'esempio precedente, la seguente tabella descrive l'estrazione del token per vari valori di text_data. Tieni presente che in questo documento il punto interrogativo () è stato in corsivo per distinguere due punti interrogativi (??):

Testo dati Token per l'indice Spiegazione
Quick Brown Fox ["rapido", "marrone", "volpe"] La tokenizzazione di LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"].

Poi, la normalizzazione in T.I. con icu_case_folding = true lettere minuscole dei token per produrre ["the", "quick", "brown", "fox"].

Infine, il filtro delle parole di interruzione rimuove "il" dall'elenco.
Quick Brown Fox ["rapido", "marrone", "volpe"] La tokenizzazione di LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"].

Poi, la normalizzazione in terapia intensiva NFKC con icu_case_folding = true lettere minuscole dei token per produrre ["the", "quick", "brown", "fox"]

Infine, il filtro delle parole di interruzione rimuove "il" dall'elenco.
VolpeVeloce ["Veloce??volpe"] La tokenizzazione di LOG_ANALYZER produce i token ["The", "QuickFox"].

Successivamente, la normalizzazione dell'ICU di NFKC con icu_case_folding = true minuscolo dei token per produrre ["quick??fox"]. Nota che il doppio punto di domanda Unicode è stato normalizzato in 2 caratteri ASCII a punto interrogativo.

Infine, il filtro delle parole di stop non fa nulla perché nessuno dei token è nell'elenco del filtro.

Ora che l'indice di ricerca è stato creato, puoi utilizzare la funzione SEARCH per cercare utilizzando le stesse configurazioni dell'analizzatore specificate nell'indice di ricerca. Nota che se le configurazioni dell'analizzatore nella funzione SEARCH non corrispondono a quelle dell'indice di ricerca, quest'ultimo non verrà utilizzato. Utilizza la seguente query:

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"]
      }
    ]
  }''')

Sostituisci quanto segue:

  • search_query: il testo che vuoi cercare.

Le seguenti mostra vari risultati in base a testi di ricerca diversi e valori di search_query:

text_data search_query Risultato Spiegazione
Quick Brown Fox "Ⓠuick" TRUE L'elenco finale dei token estratti dal testo è ["rapido", "marrone", "volpe"].
L'elenco finale dei token estratti dalla query di testo è ["rapido"].

I token delle query liste sono disponibili nei token di testo.
Quick Brown Fox "quick" TRUE L'elenco finale dei token estratti dal testo è ["rapida", "marrone", "fox"].
L'elenco finale dei token estratti dalla query di testo è ["rapido"].

I token delle query liste sono disponibili nei token di testo.
VolpeVeloce "quick" FALSE L'elenco finale dei token estratti dal testo è ["quick??fox"].

L'elenco finale dei token estratti dalla query di testo è ["rapido"].

"rapido" non è nell'elenco dei token del testo.
VolpeVeloce "quickfox" TRUE L'elenco finale dei token estratti dal testo è ["quick??fox"].

L'elenco finale dei token estratti dalla query di testo è ["quick??fox"].

"Veloce??volpe" è nell'elenco dei token del testo.
VolpeVeloce "`quickfox`" FALSE In LOG_ANALYZER, l'accento grave richiede una corrispondenza di testo esatta.

PATTERN_ANALYZER per ricerca IPv4 con stop word

L'esempio seguente configura l'analizzatore di testo PATTERN_ANALYZER per la ricerca di un pattern specifico e il filtraggio di determinate parole di stop. In questo esempio, il pattern corrisponde a un indirizzo IPv4 e ignora il valore localhost (127.0.0.1).

Questo esempio presuppone che la seguente tabella venga compilata con dati:

CREATE TABLE dataset.data_table(
  text_data STRING
);

Per creare un indice di ricerca, l'opzione pattern e un elenco di parole di stop, crea un Stringa con formattazione JSON nell'opzione analyzer_options del DDL CREATE SEARCH INDEX Informativa. Per un elenco completo delle opzioni disponibili durante la creazione di un indice di ricerca con PATTERN_ANALYZER, vedi PATTERN_ANALYZER, Per questo esempio, le nostre parole di stop sono l'indirizzo 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 utilizzi espressioni regolari con analyzer_options, includi tre iniziali \ per eseguire correttamente l'escape delle espressioni regolari che includono un Simbolo \, ad esempio \d o \b.

La seguente tabella descrive le opzioni di tokenizzazione per vari valori di text_data

Testo dati Token per l'indice Spiegazione
abc192.168.1.1def 172.217.20.142 ["192.168.1.1", "172.217.20.142"] I pattern IPv4 acquisiscono gli indirizzi IPv4 anche se non vi è spazio tra l'indirizzo e il testo.
104.24.12.10abc 127.0.0.1 ["104.24.12.10"] "127.0.0.1" viene filtrato poiché è nell'elenco delle parole di stop.

Ora che l'indice di ricerca è stato creato, puoi utilizzare la funzione SEARCH per cercare basata sulla tokenizzazione specificata in analyzer_options. Utilizza la seguente query:

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"
        ]
      }
    ]
  }'''
);

Sostituisci quanto segue:

  • search_query: il testo che vuoi cercare.

Le seguenti mostra vari risultati in base a testi di ricerca diversi e valori di search_query:

text_data search_query Risultato Spiegazione
128.0.0.2 "127.0.0.1" ERRORE Nessun token di ricerca nella query.

La query passa attraverso lo strumento di analisi del testo, che filtra "127.0.0.1" di accesso.
abc192.168.1.1def 172.217.20.142 "192.168.1.1abc" VERO L'elenco dei token estratti dalla query è ["192.168.1.1"].

L'elenco dei token estratti dal testo è ["192.168.1.1", "172.217.20.142"].
abc192.168.1.1def 172.217.20.142 "`192.168.1.1`" VERO L'elenco dei token estratti dalla query è ["192.168.1.1"].

L'elenco dei token estratti dal testo è ["192.168.1.1", "172.217.20.142"].

Tieni presente che gli apici inversi vengono trattati come caratteri normali per Pattern_ANALYZER.

Passaggi successivi

  • Per una panoramica dei casi d'uso dell'indice di ricerca, dei prezzi, delle autorizzazioni richieste e delle limitazioni, consulta la sezione Introduzione alla ricerca BigQuery.
  • Per informazioni su una ricerca efficiente delle colonne indicizzate, consulta Cerca con un indice.