Utilizza gli analizzatori di testo

La configurazione di analizzatori di testo avanzati in BigQuery ti consente di perfezionare l'esperienza di ricerca controllando esattamente il modo in cui i dati delle stringhe vengono tokenizzati. L'applicazione di configurazioni personalizzate agli indici della Ricerca, come pattern di espressioni regolari e filtri per le stop word, ti consente di stabilire con precisione in che modo la funzione valuta e trova corrispondenze con il testo. Puoi configurare analizzatori di testo avanzati per l'istruzione DDL CREATE SEARCH INDEX, la funzione SEARCH e la funzione TEXT_ANALYZE.

Analizzatori di testo

BigQuery supporta i seguenti analizzatori di testo:

  • NO_OP_ANALYZER
  • LOG_ANALYZER
  • PATTERN_ANALYZER

NO_OP_ANALYZER

Utilizza NO_OP_ANALYZER quando hai dati pre-elaborati che vuoi far corrispondere esattamente. Al testo non viene applicata alcuna tokenizzazione o normalizzazione. Poiché questo analizzatore non esegue la tokenizzazione o la normalizzazione, non accetta alcuna configurazione. Per saperne di più su NO_OP_ANALYZER, consulta NO_OP_ANALYZER.

LOG_ANALYZER

LOG_ANALYZER modifica i dati nei seguenti modi:

  • Il testo viene convertito in minuscolo.
  • I valori ASCII superiori a 127 vengono mantenuti invariati.

  • Il testo viene suddiviso in singoli termini chiamati token dai seguenti 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 quelli che vuoi utilizzare come opzioni dell'analizzatore di testo. LOG_ANALYZER ti consente di configurare delimitatori e filtri dei token specifici per un maggiore controllo sui risultati di ricerca. Per saperne di più sulle opzioni di configurazione specifiche disponibili quando utilizzi LOG_ANALYZER, consulta Opzione analizzatore delimiters e Opzione analizzatore token_filters.

PATTERN_ANALYZER

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

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

La tabella seguente fornisce esempi di estrazione dei token PATTERN_ANALYZER:

Pattern Testo di input Token di output
ab ababab
  • ab
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • 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
".+" "cats" e "dogs"
  • "cats" e "dogs"


Tieni presente che l 'uso di quantificatori greedy + fa sì che la corrispondenza corrisponda alla stringa più lunga possibile nel testo, causando l'estrazione di"cats " e"dogs" come token nel testo.
".+?" "cats" e "dogs"
  • "cats"
  • "dogs"


Tieni presente che l'uso di quantificatori lazy +? fa sì che l'espressione regolare corrisponda alla stringa più breve possibile nel testo, causando l'estrazione di '"cats"' e '"dogs"' come due token separati nel testo.

L'utilizzo dell'analizzatore di testo PATTERN_ANALYZER ti offre un maggiore controllo sui token estratti da un testo quando viene utilizzato con la funzione SEARCH. La tabella seguente mostra in che modo pattern e risultati diversi generano risultati SEARCH diversi:

Pattern Query Testo Token dal testo SEARCH(text, 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/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
VERO '/bb/' in ['/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 query

Corrispondenza di backtick come backtick, non come carattere speciale.
[a-z][a-z0-9]*@google\.com Questa è la mia 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 subquery (ovvero) dopo essere stata analizzata dall'analizzatore della query di ricerca, poiché lo spazio è preceduto da un carattere di escape.
(?i)(?:Abc) (nessuna normalizzazione) aBcd Abc
  • Abc
FALSE 'aBc' in ['Abc']
(?i)(?:Abc)

normalization:
lower_case = true
aBcd Abc
  • abc
VERO 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
VERO '/abc' in ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE 'abc' in ['/abc']
".+" "cats" "cats" e "dogs"
  • "cats" e "dogs"
FALSE '"cats"' in ['"cats" and "dogs"]

Tieni presente che l'uso di quantificatori greedy + fa sì che l'espressione regolare corrisponda alla stringa più lunga possibile nel testo, causando l'estrazione di '"cats" and "dogs"' come token nel testo.
".+?" "cats" "cats" e "dogs"
  • "cats"
  • "dogs"
VERO '"cats"' in ['"cats"', '"dogs"]

Tieni presente che l'uso di quantificatori lazy +? fa sì che l'espressione regolare corrisponda alla stringa più breve possibile nel testo, in modo che '"cats"', '"dogs"' vengano estratti come due token separati nel testo.

Esempi

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

LOG_ANALYZER con normalizzazione ICU NFKC e stop word

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

CREATE TABLE dataset.data_table(
  text_data STRING
);

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

In base all'esempio precedente, la tabella seguente descrive l'estrazione dei token per vari valori di text_data. Tieni presente che in questo documento il carattere del doppio punto interrogativo (⁇) è stato formattato in corsivo per distinguerlo da due punti interrogativi (??):

Testo dei dati Token per l'indice Spiegazione
The Quick Brown Fox ["quick", "brown", "fox"] La tokenizzazione LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"].

Successivamente, la normalizzazione T.I. con icu_case_folding = true converte i token in minuscolo per produrre ["the", "quick", "brown", "fox"]

Infine, il filtro delle stop word rimuove "the" dall'elenco.
The Ⓠuick Ⓑrown Ⓕox ["quick", "brown", "fox"] La tokenizzazione LOG_ANALYZER produce i token ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"].

Successivamente, la normalizzazione NFKC ICU con icu_case_folding = true converte i token in minuscolo per produrre ["the", "quick", "brown", "fox"]

Infine, il filtro delle stop word rimuove "the" dall'elenco.
Ⓠuick⁇Ⓕox ["quick??fox"] La tokenizzazione LOG_ANALYZER produce i token ["The", "Ⓠuick⁇Ⓕox"].

Successivamente, la normalizzazione NFKC ICU con icu_case_folding = true converte i token in minuscolo per produrre ["quick??fox"]. Tieni presente che il doppio punto interrogativo Unicode è stato normalizzato in due caratteri ASCII con punto interrogativo.

Infine, il filtro delle stop word non esegue alcuna operazione perché nessuno dei token è presente nell'elenco dei filtri.

Ora che l'indice della Ricerca è stato creato, puoi utilizzare la funzione SEARCH per eseguire ricerche nella tabella utilizzando le stesse configurazioni dell'analizzatore specificate nell'indice della Ricerca. Tieni presente che se le configurazioni dell'analizzatore nella funzione SEARCH non corrispondono a quelle dell'indice della Ricerca, l'indice della Ricerca non verrà utilizzato. Utilizza la query seguente:

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.

La seguente tabella mostra vari risultati in base a diversi testi di ricerca e diversi valori di search_query:

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

I token di query dell'elenco sono tutti disponibili nei token di testo.
The Ⓠuick Ⓑrown Ⓕox "quick" TRUE L'elenco finale di token estratti dal testo è ["quick", "brown", "fox"].
L'elenco finale dei token estratti dalla query di testo è ["quick"].

I token di query dell'elenco sono tutti disponibili nei token di testo.
Ⓠuick⁇Ⓕox "quick" FALSE L'elenco finale di token estratti dal testo è ["quick??fox"].

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

"quick" non è nell'elenco dei token del testo.
Ⓠuick⁇Ⓕox "quick⁇fox" TRUE L'elenco finale di token estratti dal testo è ["quick??fox"].

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

"quick??fox" è nell'elenco dei token del testo.
Ⓠuick⁇Ⓕox "`quick⁇fox`" FALSE In LOG_ANALYZER, l'apice inverso richiede una corrispondenza esatta del testo.

PATTERN_ANALYZER per la ricerca IPv4 con stop word

L'esempio seguente configura l'analizzatore di testo PATTERN_ANALYZER per cercare un pattern specifico filtrando alcune parole non significative. 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 sia compilata con i dati:

CREATE TABLE dataset.data_table(
  text_data STRING
);

Per creare un indice della Ricerca, l'opzione pattern e un elenco di stop word, crea una stringa in formato JSON nell'opzione analyzer_options dell'istruzione DDL CREATE SEARCH INDEX. Per un elenco completo delle opzioni disponibili durante la creazione di un indice della Ricerca con PATTERN_ANALYZER, consulta PATTERN_ANALYZER. In questo esempio, le nostre stop word 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 le espressioni regolari con analyzer_options, includi tre simboli \ iniziali per eseguire correttamente l'escape delle espressioni regolari che includono un simbolo \, ad esempio \d o \b.

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

Testo dei 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 c'è 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 perché è nell'elenco delle stop word.

Ora che l'indice della Ricerca è stato creato, puoi utilizzare la funzione SEARCH per eseguire ricerche nella tabella in base alla tokenizzazione specificata in analyzer_options. Utilizza la query seguente:

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.

La seguente tabella mostra vari risultati in base a diversi testi di ricerca e diversi 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 l'analizzatore di testo, che filtra il token "127.0.0.1".
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