Trabajar con analizadores de texto
Las CREATE SEARCH INDEX
instrucciones DDL,
la SEARCH
función y la TEXT_ANALYZE
función
admiten opciones de configuración avanzadas del analizador de texto. Si conoces los analizadores de texto de BigQuery y sus opciones, podrás mejorar tu experiencia de búsqueda.
En este documento se ofrece una descripción general de los diferentes analizadores de texto disponibles en BigQuery y de 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 preprocesados que quieras que coincidan exactamente. 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
La función LOG_ANALYZER
modifica los datos de las siguientes formas:
- El texto se pone en minúsculas.
Los valores ASCII superiores a 127 se conservan tal cual.
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 que quieras 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 búsqueda. Para obtener más información sobre las opciones de configuración específicas disponibles al usarLOG_ANALYZER
, consulta las opcionesdelimiters
analyzer ytoken_filters
analyzer.
PATTERN_ANALYZER
El analizador de texto PATTERN_ANALYZER
extrae tokens de texto mediante una expresión regular. El motor y la sintaxis de expresiones regulares que se usan con PATTERN_ANALYZER
son RE2. PATTERN_ANALYZER
tokeniza los patrones en el siguiente orden:
- Busca la primera subcadena que coincida con el patrón (de izquierda a derecha) en la cadena. Es un token que se incluirá en la salida.
- Elimina todo lo que haya en la cadena de entrada hasta el final de la subcadena encontrada en el paso 1.
- Repite el proceso hasta que la cadena esté vacía.
En la siguiente tabla se muestran 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 |
|
".+" | "gatos" y "perros" |
Ten en cuenta que el uso de cuantificadores ávidos + hace que la coincidencia se corresponda con la cadena más larga posible en el texto, lo que provoca que "cats" y "dogs" se extraigan como un token en el texto. |
".+?" | "gatos" y "perros" |
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 provoca que "cats" y "dogs" se extraigan como dos tokens independientes en el texto. |
Si usas el analizador de texto PATTERN_ANALYZER
, tendrás más control sobre los tokens extraídos de un texto cuando lo utilices con la función SEARCH
. En la siguiente tabla se muestra cómo se obtienen diferentes SEARCH
resultados en función de los patrones y los resultados:
Patrón | Consulta | Texto | Tokens del texto | BUSCAR(texto; consulta) | Explicación |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | "abc" in ["abcghi"] |
cd[a-z] | abcdef | abcghi |
|
FALSO | '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/' en ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERROR | No se ha encontrado ninguna coincidencia en el término de consulta |
[0-9]+ | abc | abc123 | ERROR | No se ha encontrado ninguna coincidencia en el término de consulta | |
[0-9]+ | `abc` | abc123 | ERROR | No se ha encontrado ninguna coincidencia en el término de consulta Se ha encontrado una comilla inversa que coincide con otra comilla inversa, no con un carácter especial. |
|
[a-z][a-z0-9]*@google\.com | Este es mi correo: test@google.com | test@google.com |
|
TRUE | 'test@google.com' in 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | "abc" en ["abc"] Ten en cuenta que "abc abc" es una única subconsulta(es decir) después de que el analizador de consultas de búsqueda la haya analizado, ya que el espacio está escapado. |
(?i)(?:Abc) (sin normalización) | aBcd | Abc |
|
FALSO | 'aBc' in ['Abc'] |
(?i)(?:Abc) normalización: lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' in ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' in ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSO | 'abc' in ['/abc'] |
".+" | "gatos" | "gatos" y "perros" |
|
FALSO | "cats" en ["cats" and "dogs"] Ten en cuenta que el uso de cuantificadores ávidos + hace que la expresión regular coincida con la cadena más larga posible en el texto, lo que provoca que "cats" and "dogs" se extraiga como un token en el texto. |
".+?" | "gatos" | "gatos" y "perros" |
|
TRUE | '"cats"' in ['"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 del texto, lo que provoca que '"cats"' y '"dogs"' se extraigan como dos tokens independientes en el texto. |
Ejemplos
En los siguientes ejemplos se muestra cómo usar el análisis de texto con opciones de personalización para crear índices de búsqueda, extraer tokens y devolver resultados de búsqueda.
LOG_ANALYZER
con normalización NFKC ICU y palabras de parada
En el siguiente ejemplo se configuran las opciones de LOG_ANALYZER
con la normalización NFKC ICU
y las palabras de parada. En este ejemplo se presupone que la tabla de datos ya contiene datos:
CREATE TABLE dataset.data_table( text_data STRING );
Para crear un índice de búsqueda con normalización NFKC ICU y una lista de palabras irrelevantes, crea una cadena con formato JSON en la opción analyzer_options
de la instrucción CREATE
SEARCH INDEX
DDL.
Para ver una lista completa de las opciones disponibles al crear 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 doble signo de interrogación (⁇) se ha puesto en cursiva para diferenciarlo de dos signos de interrogación (??):
Texto de datos | Tokens del índice | Explicación |
---|---|---|
The Quick Brown Fox | ["rápido", "marrón", "zorro"] | La tokenización de LOG_ANALYZER genera los tokens ["The", "Quick", "Brown", "Fox"]. A continuación, la normalización de ICU con icu_case_folding = true convierte los tokens a minúsculas para generar ["the", "quick", "brown", "fox"].Por último, el filtro de palabras de parada elimina "the" de la lista. |
El Ⓠuick Ⓑrown Ⓕox | ["rápido", "marrón", "zorro"] | La tokenización de LOG_ANALYZER genera los tokens ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]. A continuación, la normalización NFKC ICU con icu_case_folding = true convierte los tokens a minúsculas para generar ["the", "quick", "brown", "fox"].Por último, el filtro de palabras de parada elimina "the" de la lista. |
Ⓠuick⁇Ⓕox | ["quick??fox"] | La tokenización de LOG_ANALYZER genera los tokens ["The", "Ⓠuick⁇Ⓕox"]. A continuación, la normalización NFKC ICU con icu_case_folding = true convierte los tokens a minúsculas para producir ["quick??fox"]. Ten en cuenta que el carácter Unicode de doble signo de interrogación se ha normalizado en dos 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 ha creado el índice de búsqueda, puedes usar la SEARCH
función para buscar en la tabla con las mismas configuraciones de analizador especificadas en el índice de búsqueda. Ten en cuenta que, si las configuraciones del analizador de la función SEARCH
no coinciden con las del índice de búsqueda, este no se usará. 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"] } ] }''')
Haz los cambios siguientes:
search_query
: el texto que quieras buscar.
En la siguiente tabla se muestran varios resultados en función de diferentes textos de búsqueda y 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 ["rápido"]. Todos los tokens de consulta de listas se encuentran en los tokens de texto. |
El Ⓠ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 ["rápido"]. Todos los tokens de consulta de listas se encuentran 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 ["rápido"]. <0x0A;"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 consulta de texto es ["quick??fox"]. "quick??fox" está en la lista de tokens del texto. |
Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
En LOG_ANALYZER , la comilla inversa requiere una coincidencia de texto exacta. |
PATTERN_ANALYZER
para buscar 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 determinadas palabras de parada. En este ejemplo, el patrón coincide con una dirección IPv4 e ignora el valor de localhost (127.0.0.1
).
En este ejemplo se presupone que la siguiente tabla contiene datos:
CREATE TABLE dataset.data_table( text_data STRING );
Para crear un índice de búsqueda, 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 instrucción DDL CREATE SEARCH
INDEX
.
Para ver una lista completa de las opciones disponibles al crear un índice de búsqueda con PATTERN_ANALYZER
, consulta PATTERN_ANALYZER
.
En este ejemplo, las palabras de detención son la dirección 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 utilices expresiones regulares con analyzer_options
, incluye tres símbolos \
iniciales para escapar correctamente las expresiones regulares que incluyan un símbolo \
, como \d
o \b
.
En la siguiente tabla se describen las opciones de tokenización para distintos valores de text_data
.
Texto de datos | Tokens del índice | Explicación |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | Los patrones IPv4 capturan las direcciones IPv4 aunque no haya ningún espacio entre la dirección y el texto. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | "127.0.0.1" se excluye porque está en la lista de palabras irrelevantes. |
Ahora que se ha creado el índice de búsqueda, puede usar la SEARCH
función 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" ] } ] }''' );
Haz los cambios siguientes:
search_query
: el texto que quieras buscar.
En la siguiente tabla se muestran varios resultados en función de diferentes textos de búsqueda y valores de search_query
:
text_data | search_query |
Resultado | Explicación |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERROR | No hay ningún token de búsqueda en la consulta. La consulta pasa por el analizador de texto, que filtra la 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 las comillas inversas se tratan como caracteres normales en PATTERN_ANALYZER. |
Siguientes pasos
- Para obtener una descripción general de los casos prácticos, los precios, los permisos necesarios y las limitaciones de los índices de búsqueda, consulta la introducción a la búsqueda en BigQuery.
- Para obtener información sobre cómo buscar de forma eficiente en columnas indexadas, consulta Buscar con un índice.