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 usar LOG_ANALYZER, consulta las opciones delimiters analyzer y token_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:

  1. 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.
  2. Elimina todo lo que haya en la cadena de entrada hasta el final de la subcadena encontrada en el paso 1.
  3. 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
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
".+" "gatos" y "perros"
  • "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"
  • "gatos"
  • "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
  • abcghi
TRUE "abc" in ["abcghi"]
cd[a-z] abcdef abcghi
  • abcghi
FALSO 'cde' in ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' en ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
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
  • test@google.com
TRUE 'test@google.com' in 'test@google.com'
abc 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
  • Abc
FALSO 'aBc' in ['Abc']
(?i)(?:Abc)

normalización:
lower_case = true
aBcd Abc
  • abc
TRUE 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' in ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSO 'abc' in ['/abc']
".+" "gatos" "gatos" y "perros"
  • "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"
  • "gatos"
  • "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 SEARCHfunció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 "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" está en la lista de tokens del texto.
ⓆuickⒻox "`quickfox`" 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 SEARCHfunció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.