Asignación de token

En esta página, se describe cómo agregar la tokenización a las tablas. La tokenización es necesaria para crear los tokens que se usan en el índice de búsqueda.

La tokenización es el proceso de transformar valores en tokens. El método que usas para tokenizar un documento determina los tipos y la eficiencia de las búsquedas que los usuarios pueden realizar en él.

Spanner proporciona analizadores de texto para texto en lenguaje natural, subcadenas, texto literal, números y valores booleanos. El esquema de la base de datos usa el analizador que coincide con el tipo de búsqueda necesario para la columna. Los tokenizers tienen las siguientes características:

  • Cada analizador de tokens es una función de SQL que obtiene una entrada, como una cadena o un número, y argumentos con nombre para opciones adicionales.
  • El analizador de tokens genera un TOKENLIST.

Por ejemplo, una cadena de texto The quick brown fox jumps over the lazy dog se segmenta en [the,quick,brown,fox,jumps,over,the,lazy,dog]. Una cadena HTML The <b>apple</b> is <i>red</i> se divide en [the,apple,is,red].

Los tokens tienen las siguientes características:

  • Los tokens se almacenan en columnas que usan el tipo de datos TOKENLIST.
  • Cada token se almacena como una secuencia de bytes, con un conjunto opcional de atributos asociados. Por ejemplo, en las aplicaciones de texto completo, un token suele ser una sola palabra de un documento de texto.
  • Cuando se asigna un token a los valores HTML, Spanner genera atributos que indican la importancia de un token dentro del documento. Spanner usa estos atributos para asignar puntuaciones y mejorar los términos más prominentes (como un encabezado).

Tokenizadores

Spanner admite las siguientes funciones de tokenizador:

  • El analizador de texto completo (TOKENIZE_FULLTEXT) produce tokens de palabras completas para las consultas en lenguaje natural.

    Ejemplo

    Ambas funciones

    TOKENIZE_FULLTEXT("Yellow apple")
    TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
    

    producen los mismos tokens: [yellow,apple].

  • El asignador de tokens de subcadena (TOKENIZE_SUBSTRING) genera tokens para cada n-grama de cada palabra. Se usa para encontrar subcadenas de palabras en un texto.

    Ejemplo

    TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
    

    Produce los siguientes tokens: [ello,hell,hello,orld,worl,world].

  • El tokenizador de n-gramas (TOKENIZE_NGRAMS) genera n-gramas a partir de una entrada (sin dividirla en palabras separadas). Se usa para acelerar los predicados de expresión regular.

    Ejemplo

    La siguiente función:

    TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
    

    Produce los siguientes tokens: ["Big ","ig T","g Ti"," Tim", "Time"].

  • Los analizadores de concordancia exacta (TOKEN y TOKENIZE_BOOL) se usan para buscar filas que contengan un valor determinado en una de sus columnas. Por ejemplo, una aplicación que indexa un catálogo de productos podría querer buscar productos de una marca y un color en particular.

    Ejemplos

    Las siguientes funciones:

    TOKEN("hello")
    TOKEN(["hello", "world"])
    

    Produce los siguientes tokens, respectivamente: [hello] y [hello,world].

    La siguiente función:

    TOKENIZE_BOOL(true)
    

    Produce el siguiente token: [y].

  • Los analizadores de números (TOKENIZE_NUMBER) se usan para generar un conjunto de tokens que aceleran las búsquedas de comparación numérica. En el caso de las condiciones de igualdad, el token es el número en sí. En el caso de las condiciones de rango (como rating >= 3.5), el conjunto de tokens es más elaborado.

    Ejemplos

    Las siguientes instrucciones de función:

    TOKENIZE_NUMBER(42, comparison_type=>"equality")
    TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
    

    Produce los siguientes tokens, respectivamente: "==42" y "==42", "[1,75]","[36, 45]","[36,55]","[36, 75]".

Por lo general, las funciones de tokenización se usan en una expresión de columna generada. Estas columnas se definen como HIDDEN para que no se incluyan en los resultados de la consulta SELECT *.

En el siguiente ejemplo, se usa un analizador de texto completo y un analizador numérico para crear una base de datos que almacene nombres y calificaciones de álbumes musicales. La sentencia DDL realiza dos acciones:

  1. Define las columnas de datos AlbumTitle y Rating.
  2. Define AlbumTitle_Tokens y AlbumRating_Tokens. Estas columnas TOKENLIST tokenizan los valores de las columnas de datos para que Spanner pueda indexarlos.

    CREATE TABLE Albums (
      AlbumId STRING(MAX) NOT NULL,
      AlbumTitle STRING(MAX),
      Rating FLOAT64,
      AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
      Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN
    ) PRIMARY KEY(AlbumId);
    

Cada vez que se modifican los valores base, AlbumTitle_Tokens y Rating_Tokens se actualizan automáticamente.

Asigna tokens a contenido HTML o de texto sin formato

La tokenización de texto admite tipos de contenido de texto sin formato y HTML. Usa la función TOKENIZE_FULLTEXT de Spanner para crear tokens. Luego, usa la declaración DDL CREATE SEARCH INDEX para generar el índice de búsqueda.

Por ejemplo, la siguiente sentencia DDL CREATE TABLE usa la función TOKENIZE_FULLTEXT para crear tokens a partir de AlbumTitles en la tabla Albums. La sentencia DDL CREATE SEARCH INDEX crea un índice de búsqueda con el nuevo AlbumTitles_Tokens.

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)

El proceso de tokenización usa las siguientes reglas:

  • La tokenización no incluye la lematización ni la corrección de palabras mal escritas. Por ejemplo, en una oración como "Un gato miraba un grupo de gatos", el token "gato" se indexa por separado del token "gatos". En comparación con otros motores de búsqueda que normalizan los tokens durante las operaciones de escritura, Spanner proporciona una opción para expandir la búsqueda para incluir diferentes formas de palabras. Para obtener más información, consulta Modo de consulta mejorado.
  • Las palabras de parada (como "a") se incluyen en el índice de búsqueda.
  • La búsqueda de texto completo siempre distingue mayúsculas de minúsculas. El proceso de tokenización convierte todos los tokens a minúsculas.

El proceso de tokenización hace un seguimiento de las posiciones de cada token en el texto original. Estas posiciones se usan más adelante para hacer coincidir frases. Las posiciones se almacenan en el índice de búsqueda junto con los docids.

Google sigue mejorando los algoritmos de tokenización. En algunos casos, esto podría hacer que una cadena se segmente de manera diferente en el futuro de la forma en que se segmenta ahora. Esperamos que estos casos sean muy poco comunes. Un ejemplo de esto es si hay una mejora en la segmentación de los idiomas chino, japonés y coreano (CJK).

El argumento content_type especifica si el formato del contenido usa texto sin formato o HTML. Usa la siguiente configuración para establecer content_type:

  • Para la tokenización de texto, establece el argumento content_type en "text/plain". Este es el parámetro de configuración predeterminado.
  • Para la tokenización de HTML, establece el argumento content_type en "text/html". Sin este argumento, las etiquetas HTML se tratan como puntuación. En el modo HTML, Spanner usa heurísticas para inferir qué tan destacado es el texto en la página. Por ejemplo, si el texto está en un encabezado o su tamaño de fuente. Los atributos admitidos para HTML incluyen small, medium, large, title y "link". Al igual que la posición, el atributo se almacena junto con el token en el índice de búsqueda. La tokenización no crea tokens para ninguna etiqueta HTML.

Los atributos de token no afectan la coincidencia ni los resultados de la función SEARCH o SEARCH_SUBSTRING. Solo se usan para la clasificación.

En el siguiente ejemplo, se muestra cómo tokenizar texto:

CREATE TABLE T (
  ...
  Text STRING(MAX),
  Html STRING(MAX),
  Text_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
  Html_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);

Refinamiento de la detección de idioma con el argumento language_tag

La tokenización detecta el idioma de entrada automáticamente, de forma predeterminada. Cuando se conoce el idioma de entrada, se puede usar un argumento language_tag para definir mejor este comportamiento:

AlbumTitle_Tokens TOKENLIST
  AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN

La mayoría de las aplicaciones dejan el argumento language_tag sin especificar y, en su lugar, dependen de la detección automática de idioma. La segmentación para idiomas asiáticos, como el chino, el coreano y el japonés, no requiere configurar el idioma de tokenización.

En los siguientes ejemplos, se muestran casos en los que language_tag afecta la asignación de tokens:

Función de tokenización Tokens producidos
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") [a, tout, pourquoi, il, ya, un, parce, que]
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr" [a, tout, pourquoi, il, y, a, un, parce, que]
TOKENIZE_FULLTEXT("旅 行") Dos tokens: [旅, 行]
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") Un token: [旅行]

¿Qué sigue?