En esta página, se describe cómo agregar la asignación de token a las tablas. La asignación de token es necesaria para crear los tokens que se usan en el índice de búsqueda.
La asignación de token 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 tokenizadores para texto en lenguaje natural, subcadenas, texto literal, números y valores booleanos. El esquema de la base de datos usa el tokenizador que coincide con el tipo de búsqueda necesario para la columna. Los tokenizadores tienen las siguientes características:
- Cada tokenizador es una función SQL que obtiene una entrada, como una cadena o un número, y argumentos con nombre para opciones adicionales.
- El tokenizador genera un
TOKENLIST.
Por ejemplo, una cadena de texto The quick brown fox jumps over the lazy dog se tokeniza en [the,quick,brown,fox,jumps,over,the,lazy,dog].
Una cadena HTML The <b>apple</b> is <i>red</i> se tokeniza 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 tokenizan valores HTML, Spanner genera atributos que indican la importancia de un token dentro del documento. Spanner usa estos atributos para la puntuación para impulsar términos más destacados (como un encabezado).
Tokenizadores
Spanner admite las siguientes funciones de tokenizador:
El tokenizador de texto completo (
TOKENIZE_FULLTEXT) produce tokens de palabras completas para consultas en lenguaje natural.Ejemplo
Ambas funciones siguientes
GoogleSQL
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")PostgreSQL
En este ejemplo, se usa
spanner.tokenize_fulltext.spanner.tokenize_fulltext("Yellow apple") spanner.tokenize_fulltext('Yellow <b>apple</b>', context_type=>'text/html')producen los mismos tokens:
[yellow,apple].El tokenizador de subcadenas (
TOKENIZE_SUBSTRING) genera tokens para cada n-grama de cada palabra. Se usa para encontrar subcadenas de palabras en un texto.Ejemplo
GoogleSQL
TOKENIZE_SUBSTRING('hello world', ngram_size_min=>4, ngram_size_max=>6)PostgreSQL
En este ejemplo, se usa
spanner.tokenize_substring.spanner.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 expresiones regulares.Ejemplo
La siguiente función:
GoogleSQL
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)PostgreSQL
En este ejemplo, se usa
spanner.tokenize_ngrams.spanner.tokenize_ngrams('big time', ngram_size_min=>4, ngram_size_max=>4)Produce los siguientes tokens:
["Big ","ig T","g Ti"," Tim", "Time"].Los tokenizadores de concordancia exacta (
TOKENyTOKENIZE_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:
GoogleSQL
TOKEN("hello") TOKEN(["hello", "world"])PostgreSQL
En este ejemplo, se usa
spanner.token.spanner.token('hello')Produce los siguientes tokens:
[hello].La siguiente función:
GoogleSQL
TOKENIZE_BOOL(true)PostgreSQL
En este ejemplo, se usa
spanner.tokenize_bool.spanner.tokenize_bool(true)Produce el siguiente token:
[y].Los tokenizadores de números (
TOKENIZE_NUMBER) se usan para generar un conjunto de tokens que aceleran las búsquedas de comparación numérica Para las condiciones de igualdad, el token es el número en sí. Para las condiciones de rango (comorating >= 3.5), el conjunto de tokens es más elaborado.Ejemplos
Las siguientes instrucciones de función:
GoogleSQL
TOKENIZE_NUMBER(42, comparison_type=>'equality') TOKENIZE_NUMBER(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)PostgreSQL
En este ejemplo, se usa
spanner.tokenize_number.spanner.tokenize_number(42, comparison_type=>'equality') spanner.tokenize_number(42, comparison_type=>'all', granularity=>10, min=>1, max=>100)Producen los siguientes tokens, respectivamente:
"==42"y"==42","[1,75]","[36, 45]","[36,55]","[36, 75]".Los tokenizadores JSON y JSONB (
TOKENIZE_JSONyTOKENIZE_JSONB) se usan para generar un conjunto de tokens que aceleran los predicados de igualdad, contención y existencia de claves JSON, comodoc.key = "value"odoc[@key] IS NOT NULL(GoogleSQL) ydoc->'key' = '"value"'::jsonbodoc ? 'key'(PostgreSQL).
Las funciones de asignación de token suelen usarse 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 tokenizador de texto completo y un tokenizador numérico para crear una base de datos que almacene nombres y calificaciones de álbumes de música. La instrucción DDL realiza dos acciones:
- Define las columnas de datos
AlbumTitleyRating. Define
AlbumTitle_TokensyAlbumRating_Tokens. Estas columnasTOKENLISTtokenizan los valores de las columnas de datos para que Spanner pueda indexarlos.GoogleSQL
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);PostgreSQL
CREATE TABLE albums ( albumid character varying NOT NULL, albumtitle character varying, albumtitle_Tokens spanner.tokenlist GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN, PRIMARY KEY(albumid));
Cada vez que se modifican los valores base, AlbumTitle_Tokens y Rating_Tokens se actualizan automáticamente.
Tokeniza texto sin formato o contenido HTML
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
CREATE SEARCH INDEX
instrucción DDL para generar el índice de búsqueda.
Por ejemplo, la siguiente instrucción DDL CREATE TABLE usa la función TOKENIZE_FULLTEXT para crear tokens a partir de AlbumTitles en la tabla Albums. La instrucción DDL CREATE SEARCH INDEX crea un índice de búsqueda
con el nuevo AlbumTitles_Tokens.
GoogleSQL
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)
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL 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 derivación ni la corrección de palabras mal escritas. Por ejemplo, en una oración como "Un gato miraba a 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 escrituras, Spanner proporciona una opción para expandir la consulta de búsqueda para incluir diferentes formas de palabras. Para obtener más información, consulta Modo de consulta mejorado.
- Las palabras clave (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 en 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 continúa mejorando los algoritmos de tokenización. En algunos casos, esto podría hacer que una cadena se tokenice de manera diferente en el futuro a la forma en que se tokeniza ahora. Esperamos que estos casos sean extremadamente raros. Un ejemplo de esto es si hay una mejora en la segmentación de idiomas chino, japonés y coreano (CJK).
El argumento content_type especifica si el formato de contenido usa texto sin formato o HTML. Usa la siguiente configuración para establecer el content_type:
- Para la tokenización de texto, establece el argumento
content_typeen "text/plain". Esta es la configuración predeterminada. - Para la tokenización de HTML, establece el argumento
content_typeen"text/html". Sin este argumento, las etiquetas HTML se tratan como signos de 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 incluyensmall,medium,large,titley `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 SEARCH o
SEARCH_SUBSTRING función. Solo se usan para
la clasificación.
En el siguiente ejemplo, se muestra cómo tokenizar texto:
GoogleSQL
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(...);
PostgreSQL
CREATE TABLE t (
...
text character varying,
html character varying,
text_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(text, content_type=>"text/plain")) VIRTUAL HIDDEN,
html_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(html, content_type=>'type/html')) VIRTUAL HIDDEN,
PRIMARY KEY(...));
Perfeccionamiento de la detección de idioma con el argumento language_tag
De forma predeterminada, la tokenización detecta automáticamente el idioma de entrada. Cuando se conoce el idioma de entrada, se puede usar un argumento language_tag para perfeccionar este comportamiento:
GoogleSQL
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
PostgreSQL
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle, language_tag=>'en-us')) VIRTUAL 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 del 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 tokenización:
| 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?
- Obtén información sobre los índices de búsqueda.
- Obtén información sobre los índices numéricos.
- Obtén información sobre la partición de índices.