Trabaja con analizadores de texto
.CREATE SEARCH INDEX
Declaración DDL ,SEARCH
función yTEXT_ANALYZE
función Admite opciones avanzadas de configuración 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 es compatible con 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 la asignación de token ni la normalización al texto. Dado que este analizador no realiza la asignación de token ni la normalización, no acepta configuración. Para obtener más información sobre NO_OP_ANALYZER
, consulta NO_OP_ANALYZER
.
LOG_ANALYZER
El 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 deseas usar los delimitadores predeterminados, puedes especificar los delimitadores que deseas usar como opciones del analizador de texto.
LOG_ANALYZER
te permite configurar delimitadores específicos y filtros de token 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 mediante una expresión regular. El motor de expresión regular y la sintaxis que se usa con PATTERN_ANALYZER
es RE2. PATTERN_ANALYZER
asigna tokens a los patrones en el siguiente orden:
- Encuentra la primera substring que coincide con el patrón (de la izquierda) en la string. Este es un token que se incluirá en el resultado.
- Quita todo de la string de entrada hasta el final de la substring que se encuentra en el paso 1.
- Repite el proceso hasta que la string 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}(?:[az]000){2} | 7abc7abc7abcx000y000 |
|
".+" | “cats” y “dogs” |
Ten en cuenta que el uso de cuantizadores voraces + hace que la coincidencia coincida con la string más larga posible en el texto, lo que genera ““gatos” y “dogs” para extraer como token en el texto. |
".+?" | “cats” y “dogs” |
Ten en cuenta el uso de cuantizadores diferidos + para que la expresión regular coincida con la string más corta posible en el texto, lo que provoca “cats”. "", "dogs" para que 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 usan con la función SEARCH
. En la siguiente tabla, se muestra cómo diferentes patrones y resultados generan diferentes resultados SEARCH
:
Patrón | Consulta | Texto | Tokens de texto | BUSCAR(texto, consulta) | Explicación |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
VERDADERO | “abc” en [abcghi]] |
cd[a-z] | abcdef | abcghi |
|
FALSO | “cde” en ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
VERDADERO | “a/” en [“a/”, “b/”, “c/”, “d/”] y “b/” en ['a/”, “b/”, “c/”, “d” /'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
VERDADERO | “/bb/” en ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERROR | No se encontró ninguna coincidencia en el término de la consulta |
[0-9]+ | abc | abc123 | ERROR | No se encontró ninguna coincidencia en el término de la consulta | |
[0-9]+ | `abc` | abc123 | ERROR | No se encontró ninguna coincidencia en el término de consulta acento grave coincidente, no un carácter especial. |
|
[az][a-z0-9]*@google\.com | Este es mi correo electrónico: test@google.com | test@google.com |
|
VERDADERO | "test@google.com" en "test@google.com" |
abc | abc\ abc | abc |
|
VERDADERO | “abc” en [“abc”] Ten en cuenta que “abc abc” es una única subconsulta(es decir), después del análisis de la búsqueda, ya que se escapa el espacio. |
(?i)(?:Abc) (sin normalización) | aBcd | Abc |
|
FALSO | "aBc" en ['Abc'] |
(?i)(?:Abc) normalización: lower_case = true |
aBcd | Abc |
|
VERDADERO | “abc” en ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
VERDADERO | "/abc" en ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSO | “abc” en ['/abc'] |
".+" | “cats” | “cats” y “dogs” |
|
FALSO | ““cats”” en [““cats” y “dogs”] Ten en cuenta que el uso de cuantificadores voraces + hace que la expresión regular coincida con la la string más larga posible en el texto, lo que causa que se extraigan "cats" y "dogs" como token en el texto. |
".+?" | “cats” | “cats” y “dogs” |
|
VERDADERO | '"cats"' en ['"cats"', '"dogs"] Ten en cuenta que el uso de cuantizadores diferidos + expresión coincide con la string 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 demuestra 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 detenidas.
En el siguiente ejemplo, se configuran las opciones de LOG_ANALYZER
con la normalización de NFKC ICU y las palabras de detención. En el ejemplo, se supone que la tabla de datos ya contiene datos ya propagados:
CREATE TABLE dataset.data_table( text_data STRING );
Para crear un índice de búsqueda con normalización de ICU de NFKC y una lista de palabras detenidas, crea una string con formato JSON en la opción analyzer_options
de la declaración DDL CREATE
SEARCH INDEX
. .
Para obtener una lista completa de las opciones disponibles cuando se crea un índice de búsqueda con LOG_ANALYZER
, consulta LOG_ANALYZER
.
Para este ejemplo, nuestras palabras de detención 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, en la siguiente tabla, se 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 (??) se escribió 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 asignación de token LOG_ANALYZER produce los tokens ["The", "Quick", "Marown", "Fox"]. A continuación, la normalización de ICU con icu_case_folding = true minúsculas reduce los tokens para producir ["el", "rápido", "marrón" y "fox"]Por último, el filtro para detener palabras quita "el" de la lista. |
The brown Fox | ["quick", "brown", "fox"] | La asignación de token LOG_ANALYZER produce los tokens ["The", "Quick", "Marown", "Fox"]. A continuación, la normalización de NCU de NFKC con icu_case_folding = true minúsculas en los tokens para producir ["the", "quick", "brown", "fox"]Por último, el filtro para detener palabras quita "el" de la lista. |
¿Rápido? | ["rápido?fox"] | La asignación de token LOG_ANALYZER produce los tokens ["The", "Quick?Fox"]? A continuación, la normalización de ICU de NFKC con icu_case_folding = true minúsculas para producir los tokens [rápido??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 para detener palabras no realiza ninguna acción porque no hay ninguno de los tokens 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 de 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 según los diferentes textos de búsqueda y los distintos valores de search_query
:
Datos de texto | search_query |
Resultado | Explicación |
---|---|---|---|
The 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"]. Los tokens de consulta de lista se pueden encontrar en los tokens de texto. |
The brown Fox | "quick" |
TRUE |
La lista final de los tokens extraídos del texto es ["quick", "brown", "fox"]. La lista final de tokens extraídos de la consulta de texto es ["quick"]. Los tokens de consulta de lista se pueden encontrar en los tokens de texto. |
¿Rápido? | "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”]. “rápido” no se encuentra en la lista de tokens del texto. |
¿Rápido? | "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” se encuentra en la lista de tokens del texto? |
¿Rápido? | "`quick⁇fox`" |
FALSE |
En LOG_ANALYZER , el acento grave requiere la coincidencia de texto exacta. |
PATTERN_ANALYZER
para la búsqueda de IPv4 con palabras detenidas
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 detención. En este ejemplo, el patrón coincide con una dirección IPv4 y, además, ignora el valor de host local (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, sigue estos pasos:pattern
y una lista de palabras detenidas, crea una string con formato JSON en elanalyzer_options
Opción deCREATE SEARCH
INDEX
Declaración DDL.
Para obtener una lista completa de las opciones disponibles cuando se crea un índice de búsqueda con PATTERN_ANALYZER
, consulta PATTERN_ANALYZER
.
Para este ejemplo, nuestras palabras de detención son la dirección del host local, 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 de forma correcta las expresiones regulares que incluyen un símbolo \
, como \d
o \b
.
En la siguiente tabla, se describen las opciones de asignación de token 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 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"] | “127.0.0.1” se filtra, ya que se encuentra en la lista de palabras de detención. |
Ahora que se creó el índice de búsqueda, puedes usar la función SEARCH
para buscar en la tabla según la asignación de token 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 según los diferentes textos de búsqueda y los distintos valores de search_query
:
Datos de texto | search_query |
Resultado | Explicación |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERROR | No hay 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" | VERDADERO | 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`" | VERDADERO | 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 regulares de 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.