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 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 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:

  1. 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.
  2. Quita todo de la cadena de entrada hasta el final de la subcadena que se encuentra en el paso 1.
  3. 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
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}(?:[a-z]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
".+" 'cats' y 'dogs'
  • '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'
  • '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.

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
  • abcghi
TRUE 'abc' en ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FALSE 'cde' en ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' en ['a/', 'b/', 'c/', 'd/'] Y 'b/' en ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' en ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
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
  • test@google.com
TRUE 'test@google.com' en 'test@google.com'
abc 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
  • Abc
FALSE 'aBc' en ['Abc']
(?i)(?:Abc)

normalization:
lower_case = true
aBcd Abc
  • abc
TRUE 'abc' en ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' en ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE 'abc' en ['/abc']
".+" 'cats' 'cats' y 'dogs'
  • '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'
  • 'cats'
  • “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 "quickfox" 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 "`quickfox`" 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.