Utilizzare gli analizzatori di testo
L'istruzione DDL CREATE SEARCH INDEX
, la funzione SEARCH
e la funzione TEXT_ANALYZE
supportano opzioni di configurazione avanzate dello strumento di analisi del testo. Comprendere gli analizzatori di testo di BigQuery e le loro opzioni ti consente di perfezionare l'esperienza di ricerca.
Questo documento fornisce una panoramica dei diversi analizzatori di testo disponibili in BigQuery e delle relative opzioni di configurazione, oltre a esempi di come funzionano gli analizzatori di testo con la ricerca 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 l'NO_OP_ANALYZER
quando hai dati pre-elaborati che vuoi che corrispondano esattamente. Non viene applicata alcuna tokenizzazione o normalizzazione al testo. Poiché questo analizzatore non esegue la tokenizzazione o la normalizzazione, non accetta alcuna configurazione. Per maggiori informazioni su
NO_OP_ANALYZER
, consulta
NO_OP_ANALYZER
.
LOG_ANALYZER
L'LOG_ANALYZER
modifica i dati nei seguenti modi:
- Il testo diventa minuscolo.
I valori ASCII maggiori di 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 i delimitatori da utilizzare come opzioni dello strumento di analisi del testo.
LOG_ANALYZER
consente di configurare delimitatori e filtri token specifici per avere un maggiore controllo sui risultati di ricerca. Per ulteriori informazioni sulle opzioni di configurazione specifiche disponibili quando si utilizzaLOG_ANALYZER
, consulta l'opzione dello strumento di analisidelimiters
e l'opzione dello strumento di analisitoken_filters
.
PATTERN_ANALYZER
Lo strumento di analisi del testo PATTERN_ANALYZER
estrae i token dal testo utilizzando un'espressione regolare. Il motore delle espressioni regolari e la sintassi utilizzati con
PATTERN_ANALYZER
sono RE2. PATTERN_ANALYZER
tokenizza i pattern nel seguente ordine:
- Trova la prima sottostringa che corrisponde al pattern (da sinistra) nella stringa. Questo è un token da includere nell'output.
- Rimuove tutto dalla stringa di input fino alla fine della sottostringa indicata nel passaggio 1.
- Il processo viene ripetuto finché la stringa è vuota.
La tabella seguente fornisce esempi dell'estrazione di token PATTERN_ANALYZER
:
Pattern | Testo di input | Token di output |
---|---|---|
ab | ababab |
|
ab | Abacad |
|
[a-z]{2} | Abacad |
|
aaa | eeeeeee |
|
[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 |
|
".+" | "gatti" e "cani" |
Tieni presente che l'uso dei quantificatori greedy + consente di trovare la corrispondenza con la stringa più lunga possibile nel testo, il che provoca l'estrazione di "gatti" e "cani" come token all'interno del testo. |
".+?" | "gatti" e "cani" |
Nota che l'uso dei quantificatori lenti +? consente all'espressione regolare di corrispondere alla stringa più breve possibile nel testo, di conseguenza "gatti" e "cani" vengono estratti come due token separati nel testo. |
L'utilizzo dello strumento di analisi del testo PATTERN_ANALYZER
offre un maggiore controllo sui token estratti da un testo quando utilizzati con la funzione SEARCH
. La seguente tabella mostra in che modo pattern e risultati diversi generano risultati SEARCH
diversi:
Pattern | Query | Testo | Token da testo | SEARCH(testo; query) | Spiegazione |
---|---|---|---|---|---|
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/'] E 'b/' in ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' in ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERRORE | Nessuna corrispondenza trovata nel termine di query |
[0-9]+ | abc | abc123 | ERRORE | Nessuna corrispondenza trovata nel termine di query | |
[0-9]+ | `abc` | abc123 | ERRORE | Nessuna corrispondenza trovata nel termine di query L'accento grave corrisponde all'accento grave, non a un carattere speciale. |
|
[a-z][a-z0-9]*@google\.com | Questo è il mio indirizzo email: [email protected] | [email protected] | TRUE | "[email protected]" in "[email protected]" | |
abc | abc\ abc | abc |
|
TRUE | "abc" in ["abc"] Tieni presente che "abc abc" è una singola sottoquery, dopo essere stata analizzata dall'analizzatore sintattico delle query di ricerca poiché lo spazio contiene caratteri di escape. |
(?i)(?:Abc) (nessuna normalizzazione) | aBcd | ABC |
|
FALSE | "aBc" in ['Abc'] |
(?i)(?:Abc) normalizzazione: 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'] |
".+" | "gatti" | "gatti" e "cani" |
|
FALSE | ''gatti'' in ['"gatti" e "cani"] Nota che l'uso dei quantificatori greedy + fa sì che l'espressione regolare corrisponda alla stringa più lunga possibile nel testo, provocando l'estrazione di "gatti" e "cani" come token nel testo. |
".+?" | "gatti" | "gatti" e "cani" |
|
TRUE | '"gatti"' in ['"gatti", '"cani"] Nota che l'uso dei quantificatori lenti +? consente all'espressione regolare di corrispondere alla stringa più breve possibile nel testo, il che fa sì che "gatti" e "cani" vengano estratti come due token separati nel testo. |
Esempi
I seguenti esempi dimostrano l'utilizzo dell'analisi del testo con opzioni di personalizzazione per creare indici di 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 e la parola di arresto NFKC ICU. L'esempio presuppone la seguente tabella di dati con dati già compilati:
CREATE TABLE dataset.data_table( text_data STRING );
Per creare un indice di ricerca con normalizzazione ICU NFKC 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 di ricerca con LOG_ANALYZER
, consulta LOG_ANALYZER
.
Per 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"] } ] }''');
Dato l'esempio precedente, la tabella seguente descrive l'estrazione dei token per vari valori di text_data
. Tieni presente che in questo documento il doppio
punto interrogativo (⁇) è stato messo in corsivo per distinguere
due punti interrogativi (??):
Testo dati | Token per l'indice | Spiegazione |
---|---|---|
La volpe marrone veloce | ["veloce", "marrone", "volpe"] | La tokenizzazione LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"]. Successivamente, la normalizzazione T.I. con icu_case_folding = true minuscolo dei token per produrre ["the", "quick", "brown", "fox"]Infine, il filtro delle parole di interruzione rimuove "the" dall'elenco. |
La volpe marrone veloce | ["veloce", "marrone", "volpe"] | La tokenizzazione LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"]. Poi, la normalizzazione dell'ICU di NFKC con icu_case_folding = true minuscoli sui token per produrre ["the", "quick", "brown", "fox"]Infine, il filtro delle parole di interruzione rimuove "il" dall'elenco. |
Veloce⁇Volpe | ["veloce??volpe"] | La tokenizzazione LOG_ANALYZER produce i token ["The", "Quick⁇Fox"]. Successivamente, la normalizzazione dell'ICU di NFKC con icu_case_folding = true minuscoli sui token per produrre ["quick??fox"]. Nota che il doppio punto interrogativo Unicode è stato normalizzato in due caratteri ASCII punto interrogativo.Infine, il filtro delle parole di stop non fa nulla perché nessuno dei token è presente nell'elenco dei filtri. |
Ora che l'indice di ricerca è stato creato, puoi utilizzare la funzione SEARCH
per eseguire ricerche nella tabella utilizzando le stesse configurazioni di analizzatore specificate nell'indice di ricerca. Tieni presente che se le configurazioni dell'analizzatore nella funzione SEARCH
non corrispondono a quelle dell'indice di ricerca, l'indice di ricerca non verrà utilizzato. Usa 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 da 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 |
---|---|---|---|
La volpe marrone veloce | "Ⓠuick" |
TRUE |
L'elenco finale di token estratti dal testo è ["veloce", "marrone", "volpe"]. L'elenco finale dei token estratti dalla query di testo è ["veloce"]. I token delle query in elenco sono tutti disponibili nei token di testo. |
La volpe marrone veloce | "quick" |
TRUE |
L'elenco finale di token estratti dal testo è ["veloce", "marrone", "volpe"]. L'elenco finale dei token estratti dalla query di testo è ["veloce"]. I token delle query in elenco sono tutti disponibili nei token di testo. |
Veloce⁇Volpe | "quick" |
FALSE |
L'elenco finale dei token estratti dal testo è ["quick??fox"]. L'elenco finale dei token estratti dalla query di testo è ["veloce"]. "quick" non è nell'elenco dei token del testo. |
Veloce⁇Volpe | "quick⁇fox" |
TRUE |
L'elenco finale dei 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. |
Veloce⁇Volpe | "`quick⁇fox`" |
FALSE |
In LOG_ANALYZER , l'accento grave richiede una corrispondenza di testo esatta. |
PATTERN_ANALYZER
per la ricerca IPv4 con stop word
L'esempio seguente configura lo strumento di analisi del testo PATTERN_ANALYZER
in modo che cerchi un pattern specifico filtrando alcune stop word. In questo esempio, il pattern corrisponde a un indirizzo IPv4 e ignora il valore localhost (127.0.0.1
).
Questo esempio presuppone che la tabella seguente sia compilata con i dati:
CREATE TABLE dataset.data_table( text_data STRING );
Per creare un indice di ricerca per 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 di ricerca con PATTERN_ANALYZER
, consulta PATTERN_ANALYZER
.
Per 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 espressioni regolari con analyzer_options
, includi tre simboli \
iniziali per eseguire correttamente l'escape delle espressioni regolari che includono un simbolo \
, come \d
o \b
.
La tabella seguente 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 c'è spazio tra l'indirizzo e il testo. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | "127.0.0.1" è filtrato perché è nell'elenco delle parole di stop. |
Ora che l'indice di ricerca è stato creato, puoi utilizzare la funzione SEARCH
per cercare la tabella in base alla tokenizzazione specificata in analyzer_options
. Usa 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 da 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" | TRUE | 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"" | TRUE | 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 l'introduzione alla ricerca in BigQuery.
- Per informazioni sulla ricerca efficiente delle colonne indicizzate, consulta Eseguire ricerche con un indice.