Lavorare con gli analizzatori di testo
L'istruzione DDL CREATE SEARCH INDEX
, la funzione SEARCH
e la funzioneTEXT_ANALYZE
supportano opzioni di configurazione avanzate dello strumento di analisi di testo. Comprendere gli analizzatori di testo di BigQuery e le loro opzioni ti consente di perfezionare la tua esperienza di ricerca.
Questo documento fornisce una panoramica dei diversi analizzatori di testo disponibili in BigQuery e delle relative opzioni di configurazione, nonché esempi di come gli analizzatori di testo funzionano 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 NO_OP_ANALYZER
quando disponi di dati pre-elaborati che vuoi associare
esattamente. Non viene applicata alcuna tokenizzazione o normalizzazione al testo. Poiché questo analizzatore non esegue la tokenizzazione né la normalizzazione, non accetta alcuna configurazione. Per ulteriori informazioni su
NO_OP_ANALYZER
, consulta
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 denominati 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 da utilizzare come opzioni dello strumento di analisi del testo.
LOG_ANALYZER
consente di configurare delimitatori e filtri di token specifici per avere un maggiore controllo sui risultati di ricerca. Per saperne di più sulle opzioni di configurazione specifiche disponibili quando utilizziLOG_ANALYZER
, consulta l'opzione dell'analizzatoredelimiters
e l'opzione analizzatoretoken_filters
.
PATTERN_ANALYZER
L'analizzatore di 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. Si tratta di 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 non è vuota.
La tabella seguente fornisce esempi di estrazione di token di PATTERN_ANALYZER
:
Pattern | Testo di input | Token di output |
---|---|---|
ab | Abbab |
|
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 |
|
".+" | "gatti" e "cani" |
Tieni presente che l 'uso di quantificatori greedy + rende la corrispondenza corrispondente alla stringa più lunga possibile nel testo, causando l'estrazione di"cats " e"dogs" come token nel testo. |
".+?" | "gatti" e "cani" |
Tieni presente che l 'utilizzo di quantificatori lazy +? rende l'espressione regolare corrispondente alla stringa più breve possibile nel testo, causando l'estrazione di ""gatti", "cani" come due token separati nel testo. |
L'analizzatore di testo PATTERN_ANALYZER
offre un maggiore controllo sui
token estratti da un testo quando utilizzato 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/'] AND '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 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 L'accento grave corrisponde a un accento grave, non un carattere speciale. |
|
[a-z][a-z0-9]*@google\.com | Questo è il mio indirizzo email: test@google.com | test@google.com |
|
TRUE | "test@google.com" in "test@google.com" |
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 perché 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"] Tieni presente che l'uso di quantificatori greedy + fa sì che l'espressione regolare corrisponda alla stringa più lunga possibile nel testo, di conseguenza '"gatti" e "cani"' vengono estratti come token nel testo. |
".+?" | "gatti" | "gatti" e "cani" |
|
TRUE | '"gatti"' in ['"gatti"', '"cani"] Tieni presente che l'utilizzo di quantificatori lenti +? rende l'espressione regolare corrispondente alla stringa più breve possibile nel testo, determinando l'estrazione di "gatti", "cani" come due token separati nel testo. |
Esempi
I seguenti esempi mostrano 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 la normalizzazione e le parole di stop di NFKC ICU. 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
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 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 di token per vari valori di text_data
. Tieni presente che in questo documento il carattere del punto interrogativo doppio (⁇) è stato in corsivo per distinguere i 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"]. Successivamente, la normalizzazione T.I. con icu_case_folding = true minuscolo i token per produrre ["the", "quick", "brown", "fox"]Infine, il filtro delle parole di stop rimuove "the" dall'elenco. |
Quick Brown Fox | ["rapido", "marrone", "volpe"] | La tokenizzazione di LOG_ANALYZER produce i token ["The", "Quick", "Brown", "Fox"]. Successivamente, la normalizzazione di NFKC ICU con icu_case_folding = true minuscolo i token per produrre ["the", "quick", "brown", "fox"]Infine, il filtro delle parole di stop rimuove "the" dall'elenco. |
Volpe⁇Veloce | ["Veloce??volpe"] | La tokenizzazione di LOG_ANALYZER produce i token ["The", "Quick⁇Fox"]. Successivamente, la normalizzazione in terapia intensiva di NFKC con icu_case_folding = true minuscolo i 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 dei filtri. |
Ora che l'indice di ricerca è stato creato, puoi utilizzare la funzione SEARCH
per eseguire ricerche nella tabella utilizzando le stesse configurazioni dell'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, 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.
La seguente tabella mostra vari risultati in base a diversi testi di ricerca e valori differenti di search_query
:
text_data | search_query |
Risultato | Spiegazione |
---|---|---|---|
Quick Brown Fox | "Ⓠuick" |
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 dell'elenco 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 dell'elenco sono disponibili nei token di testo. |
Volpe⁇Veloce | "quick" |
FALSE |
L'elenco finale dei token estratti dal testo è ["quick??fox"]. L'elenco finale dei token estratti dalla query di testo è ["rapido"]. "rapida" non è nell'elenco dei token del testo. |
Volpe⁇Veloce | "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. |
Volpe⁇Veloce | "`quick⁇fox`" |
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 dell'opzione pattern
e un elenco di parole di stop, 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 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 simboli \
iniziali per eseguire correttamente l'interpretazione letterale alle espressioni regolari che includono un simbolo \
, come \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 eseguire ricerche nella tabella in base alla tokenizzazione specificata in analyzer_options
. Utilizza questa 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.
La seguente tabella mostra vari risultati in base a diversi testi di ricerca e valori differenti 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 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 di 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 di 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, dei prezzi, delle autorizzazioni richieste e delle limitazioni relative all'indice di ricerca, consulta Introduzione alla ricerca in BigQuery.
- Per informazioni su come eseguire una ricerca efficiente nelle colonne indicizzate, consulta la pagina relativa alla ricerca con un indice.