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 el LOG_ANALYZER, consulta la opción de analizador delimiters y la opción de analizador token_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:

  1. 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.
  2. Quita todo de la string de entrada hasta el final de la substring que se encuentra en el paso 1.
  3. 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
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • AC
  • ad
aaa aaaaa
  • aaa
[a-z]/ a/b/c/d/e
  • a/
  • b/
  • c/
  • d/
/[^/]+/ aa/bb/cc
  • /bb/
[0-9]+ abc
(?:/?)[a-z] /abc
  • /abc
(?:/)[a-z] /abc
  • /abc
(?:[0-9]abc){3}(?:[az]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
".+" “cats” y “dogs”
  • “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”
  • “cats”
  • “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
  • abcghi
VERDADERO “abc” en [abcghi]]
cd[a-z] abcdef abcghi
  • abcghi
FALSO “cde” en ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
VERDADERO “a/” en [“a/”, “b/”, “c/”, “d/”] y “b/” en ['a/”, “b/”, “c/”, “d” /']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
VERDADERO “/bb/” en ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
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: [email protected] [email protected] VERDADERO "[email protected]" en "[email protected]"
abc 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
  • Abc
FALSO "aBc" en ['Abc']
(?i)(?:Abc)

normalización:
lower_case = true
aBcd Abc
  • abc
VERDADERO “abc” en ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
VERDADERO "/abc" en ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSO “abc” en ['/abc']
".+" “cats” “cats” y “dogs”
  • “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”
  • “cats”
  • “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 conicu_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? "quickfox" 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? "`quickfox`" 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.