Trabaja con analizadores de texto
La declaración DDL CREATE SEARCH INDEX
, la función SEARCH
y la función TEXT_ANALYZE
admiten opciones de configuración avanzadas del analizador de texto. Comprender los analizadores de texto de BigQuery y sus opciones te permite definir mejor tu experiencia de búsqueda.
En este documento, se proporciona una descripción general de los diferentes analizadores de texto disponibles en BigQuery y sus opciones de configuración, así como ejemplos de cómo funcionan los analizadores de texto con la búsqueda en BigQuery. Para obtener más información sobre la sintaxis del analizador de texto, consulta Análisis de texto.
Analizadores de texto
BigQuery admite los siguientes analizadores de texto:
NO_OP_ANALYZER
LOG_ANALYZER
PATTERN_ANALYZER
NO_OP_ANALYZER
Usa NO_OP_ANALYZER
cuando tengas datos procesados con anterioridad que desees que coincidan con exactitud. No se aplica tokenización ni normalización al texto. Como este analizador no realiza la tokenización ni la normalización, no acepta ninguna configuración. Para obtener más información sobre NO_OP_ANALYZER
, consulta NO_OP_ANALYZER
.
LOG_ANALYZER
LOG_ANALYZER
modifica los datos de las siguientes maneras:
- El texto está en minúsculas.
Los valores ASCII mayores que 127 se conservan como están.
El texto se divide en términos individuales llamados tokens mediante los siguientes 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
Si no quieres usar los delimitadores predeterminados, puedes especificar los delimitadores que deseas usar como opciones del analizador de texto.
LOG_ANALYZER
te permite configurar delimitadores y filtros de tokens específicos para tener más control sobre los resultados de la búsqueda. Para obtener más información sobre las opciones de configuración específicas disponibles cuando usas elLOG_ANALYZER
, consulta la opción de analizadordelimiters
y la opción de analizadortoken_filters
.
PATTERN_ANALYZER
El analizador de texto PATTERN_ANALYZER
extrae tokens del texto con una expresión regular. El motor de expresión regular y la sintaxis que se usa con PATTERN_ANALYZER
es RE2. PATTERN_ANALYZER
analiza los patrones en el siguiente orden:
- Busca la primera subcadena que coincide con el patrón (desde la izquierda) en la cadena. Es un token que se incluirá en el resultado.
- Quita todo de la cadena de entrada hasta el final de la subcadena que se encuentra en el paso 1.
- Repite el proceso hasta que la cadena esté vacía.
En la siguiente tabla, se proporcionan ejemplos de extracción de tokens PATTERN_ANALYZER
:
Patrón | Texto de entrada | Tokens de salida |
---|---|---|
ab | ababab |
|
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 |
|
".+" | 'cats' y 'dogs' |
Ten en cuenta que el uso de cuantificadores codiciosos + hace que la expresión coincida con la cadena más larga posible en el texto, lo que hace que 'cats' y 'dogs' se extraigan como un token en el texto. |
".+?" | 'cats' y 'dogs' |
Ten en cuenta que el uso de cuantificadores perezosos +? hace que la expresión regular coincida con la cadena más corta posible en el texto, lo que hace que 'cats' y 'dogs' se extraigan como 2 tokens separados en el texto. |
El uso del analizador de texto PATTERN_ANALYZER
te brinda más control sobre los tokens extraídos de un texto cuando se usa con la función SEARCH
. En la siguiente tabla, se muestra cómo diferentes patrones y resultados generan diferentes resultados de SEARCH
:
Patrón | Consulta | Texto | Tokens del texto | SEARCH(text, query) | Explicación |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | 'abc' en ['abcghi'] |
cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' en ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' en ['a/', 'b/', 'c/', 'd/'] Y 'b/' en ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' en ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERROR | No se encontró ninguna coincidencia en el término de la búsqueda |
[0-9]+ | abc | abc123 | ERROR | No se encontró ninguna coincidencia en el término de la búsqueda | |
[0-9]+ | `abc` | abc123 | ERROR | No se encontró ninguna coincidencia en el término de la búsqueda Coincidencia de acentos graves como acentos graves, no como caracteres especiales. |
|
[a-z][a-z0-9]*@google\.com | Este es mi correo electrónico: test@google.com | test@google.com |
|
TRUE | 'test@google.com' en 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | 'abc' en ['abc'] Ten en cuenta que 'abc abc' es una sola subbúsqueda (es decir) después de que el analizador de búsqueda la analiza, ya que se escapa el espacio. |
(?i)(?:Abc) (sin normalización) | aBcd | Abc |
|
FALSE | 'aBc' en ['Abc'] |
(?i)(?:Abc) normalization: lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' en ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' en ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSE | 'abc' en ['/abc'] |
".+" | 'cats' | 'cats' y 'dogs' |
|
FALSE | 'cats' en ['cats' y 'dogs'] Ten en cuenta que el uso de cuantificadores codiciosos + hace que la expresión regular coincida con la cadena más larga posible en el texto, lo que hace que 'cats' y 'dogs' se extraigan como un token en el texto. |
".+?" | 'cats' | 'cats' y 'dogs' |
|
TRUE | ''cats'' en [''cats'', ''dogs'] Ten en cuenta que el uso de cuantificadores perezosos +? hace que la expresión regular coincida con la cadena más corta posible en el texto, lo que hace que ''cats'' y ''dogs'' se extraigan como 2 tokens separados en el texto. |
Ejemplos
En los siguientes ejemplos, se muestra el uso del análisis de texto con opciones de personalización para crear índices de búsqueda, extraer tokens y mostrar resultados de la búsqueda.
LOG_ANALYZER
con normalización de ICU de NFKC y palabras de parada
En el siguiente ejemplo, se configuran las opciones LOG_ANALYZER
con la normalización de ICU de NFKC y las palabras de parada. En el ejemplo, se supone que la siguiente tabla de datos ya tiene datos propagados:
CREATE TABLE dataset.data_table( text_data STRING );
Para crear un índice de búsqueda con normalización de ICU NFKC y una lista de palabras de parada, crea una cadena con formato JSON en la opción analyzer_options
de la sentencia DDL CREATE
SEARCH INDEX
.
Para obtener una lista completa de las opciones disponibles cuando creas un índice de búsqueda con
LOG_ANALYZER
, consulta
LOG_ANALYZER
.
En este ejemplo, nuestras palabras de parada son "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"] } ] }''');
En el ejemplo anterior, la siguiente tabla describe la extracción de tokens para varios valores de text_data
. Ten en cuenta que, en este documento, el carácter de signo de interrogación doble (⁇) está en cursiva para diferenciar entre dos signos de interrogación (??):
Texto de datos | Tokens para el índice | Explicación |
---|---|---|
The Quick Brown Fox | ["quick", "brown", "fox"] | La tokenización de LOG_ANALYZER produce los tokens ["The", "Quick", "Brown", "Fox"]. Luego, la normalización de ICU con icu_case_folding = true convierte los tokens a minúsculas para producir ["the", "quick", "brown", "fox"]Por último, el filtro de palabras de parada quita "the" de la lista. |
The Ⓠuick Ⓑrown Ⓕox | ["quick", "brown", "fox"] | La tokenización de LOG_ANALYZER produce los tokens ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]. A continuación, la normalización de ICU NFKC con icu_case_folding = true convierte los tokens a minúsculas para producir ["the", "quick", "brown", "fox"]Por último, el filtro de palabras de parada quita "the" de la lista. |
Ⓠuick⁇Ⓕox | ["quick??fox"] | La tokenización de LOG_ANALYZER produce los tokens ["The", "Ⓠuick⁇Ⓕox"]. A continuación, la normalización de ICU de NFKC con icu_case_folding = true convierte a minúsculas los tokens para producir ["quick??fox"]. Observa que el Unicode de signo de interrogación doble se normalizó en 2 caracteres ASCII de signo de interrogación.Por último, el filtro de palabras de parada no hace nada porque ninguno de los tokens está en la lista de filtros. |
Ahora que se creó el índice de búsqueda, puedes usar la función SEARCH
para buscar en la tabla con las mismas configuraciones del analizador especificadas en el índice de búsqueda. Ten en cuenta que, si las configuraciones del analizador en la función SEARCH
no coinciden con las del índice de búsqueda, no se usará el índice de búsqueda. Usa la siguiente 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"] } ] }''')
Reemplaza lo siguiente:
search_query
: Es el texto que deseas buscar.
En la siguiente tabla, se muestran varios resultados en función de diferentes textos de búsqueda y diferentes valores de search_query
:
text_data | search_query |
Resultado | Explicación |
---|---|---|---|
The Quick Brown Fox | "Ⓠuick" |
TRUE |
La lista final de tokens extraídos del texto es ["quick", "brown", "fox"]. La lista final de tokens extraídos de la consulta de texto es ["quick"]. Todos los tokens de consulta de lista se pueden encontrar en los tokens de texto. |
The Ⓠuick Ⓑrown Ⓕox | "quick" |
TRUE |
La lista final de tokens extraídos del texto es ["quick", "brown", "fox"]. La lista final de tokens extraídos de la consulta de texto es ["quick"]. Todos los tokens de consulta de lista se pueden encontrar en los tokens de texto. |
Ⓠuick⁇Ⓕox | "quick" |
FALSE |
La lista final de tokens extraídos del texto es ["quick??fox"]. La lista final de tokens extraídos de la consulta de texto es ["quick"]. "quick" no está en la lista de tokens del texto. |
Ⓠuick⁇Ⓕox | "quick⁇fox" |
TRUE |
La lista final de tokens extraídos del texto es ["quick??fox"]. La lista final de tokens extraídos de la búsqueda de texto es ["quick??fox"]. "quick??fox" está en la lista de tokens del texto. |
Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
En LOG_ANALYZER , el acento grave requiere una coincidencia de texto exacta. |
PATTERN_ANALYZER
para la búsqueda de IPv4 con palabras de parada
En el siguiente ejemplo, se configura el analizador de texto PATTERN_ANALYZER
para buscar un patrón específico mientras se filtran ciertas palabras de parada. En este ejemplo, el patrón coincide con una dirección IPv4 y omite el valor de localhost (127.0.0.1
).
En este ejemplo, se supone que la siguiente tabla se propaga con datos:
CREATE TABLE dataset.data_table( text_data STRING );
Para crear un índice de búsqueda con la opción pattern
y una lista de palabras de parada, crea una cadena con formato JSON en la opción analyzer_options
de la sentencia DDL CREATE SEARCH
INDEX
.
Para obtener una lista completa de las opciones disponibles cuando creas un índice de búsqueda con PATTERN_ANALYZER
, consulta PATTERN_ANALYZER
.
En este ejemplo, nuestras palabras de parada son la dirección de 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" ] } ] }''' );
Cuando uses expresiones regulares con analyzer_options
, incluye tres símbolos \
iniciales para escapar correctamente las expresiones regulares que incluyen un símbolo \
, como \d
o \b
.
En la siguiente tabla, se describen las opciones de tokenización para varios valores de text_data
.
Texto de datos | Tokens para el índice | Explicación |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | Los patrones de IPv4 capturan las direcciones IPv4, incluso si no hay espacio entre la dirección y el texto. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | Se filtra "127.0.0.1", ya que está en la lista de palabras de parada. |
Ahora que se creó el índice de búsqueda, puedes usar la función SEARCH
para buscar en la tabla según la tokenización especificada en analyzer_options
. Usa la siguiente 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" ] } ] }''' );
Reemplaza lo siguiente:
search_query
: Es el texto que deseas buscar.
En la siguiente tabla, se muestran varios resultados en función de diferentes textos de búsqueda y diferentes valores de search_query
:
text_data | search_query |
Resultado | Explicación |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERROR | No hay un token de búsqueda en la consulta. La consulta pasa por el analizador de texto, que filtra el token "127.0.0.1". |
abc192.168.1.1def 172.217.20.142 | "192.168.1.1abc" | TRUE | La lista de tokens extraídos de la consulta es ["192.168.1.1"]. La lista de tokens extraídos del texto es ["192.168.1.1", "172.217.20.142"]. |
abc192.168.1.1def 172.217.20.142 | "`192.168.1.1`" | TRUE | La lista de tokens extraídos de la consulta es ["192.168.1.1"]. La lista de tokens extraídos del texto es ["192.168.1.1", "172.217.20.142"]. Ten en cuenta que los acentos graves se tratan como caracteres normales para PATTERN_ANALYZER. |
¿Qué sigue?
- Para obtener una descripción general de los casos de uso de índices de búsqueda, los precios, los permisos necesarios y las limitaciones, consulta Introducción a la búsqueda en BigQuery.
- Para obtener información sobre la búsqueda eficiente de las columnas indexadas, consulta Busca con un índice.