En esta página, se describe cómo realizar una búsqueda que combine datos de texto completo y datos que no son de texto.
Realiza una búsqueda mixta de texto completo y no texto
Los índices de búsqueda admiten texto completo, coincidencias exactas, columnas numéricas y columnas JSON/JSONB. Puedes combinar condiciones de texto y no texto en la cláusula WHERE de manera similar a las búsquedas de varias columnas. El optimizador de consultas intenta optimizar los predicados que no son de texto con un índice de búsqueda. Si eso no es posible, Spanner evalúa la condición para cada fila que coincide con el índice de búsqueda. Las columnas a las que se hace referencia y que no se almacenan en el índice de búsqueda se recuperan de la tabla base.
Considera el siguiente ejemplo:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
Title STRING(MAX),
Rating FLOAT64,
Genres ARRAY<STRING(MAX)>,
Likes INT64,
Cover BYTES(MAX),
Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,
Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN,
Genres_Tokens TOKENLIST AS (TOKEN(Genres)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex
ON Albums(Title_Tokens, Rating_Tokens, Genres_Tokens)
STORING (Likes);
PostgreSQL
La compatibilidad con Spanner PostgreSQL tiene las siguientes limitaciones:
- La función
spanner.tokenize_numbersolo admite el tipobigint. spanner.tokenno admite la tokenización de arrays.
CREATE TABLE albums (
albumid character varying NOT NULL,
title character varying,
rating bigint,
genres character varying NOT NULL,
likes bigint,
cover bytea,
title_tokens spanner.tokenlist AS (spanner.tokenize_fulltext(title)) VIRTUAL HIDDEN,
rating_tokens spanner.tokenlist AS (spanner.tokenize_number(rating)) VIRTUAL HIDDEN,
genres_tokens spanner.tokenlist AS (spanner.token(genres)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsindex
ON albums(title_tokens, rating_tokens, genres_tokens)
INCLUDE (likes);
El comportamiento de las consultas en esta tabla incluye lo siguiente:
RatingyGenresse incluyen en el índice de búsqueda. Spanner acelera las condiciones con listas de publicación de índices de búsqueda.ARRAY_INCLUDES_ANYyARRAY_INCLUDES_ALLson funciones de GoogleSQL y no se admiten en el dialecto de PostgreSQL.SELECT Album FROM Albums WHERE Rating > 4 AND ARRAY_INCLUDES_ANY(Genres, ['jazz'])La búsqueda puede combinar conjunciones, disyunciones y negaciones de cualquier manera, lo que incluye la combinación de predicados de texto completo y no de texto. Esta consulta se acelera por completo con el índice de búsqueda.
SELECT Album FROM Albums WHERE (SEARCH(Title_Tokens, 'car') OR Rating > 4) AND NOT ARRAY_INCLUDES_ANY(Genres, ['jazz'])Likesse almacena en el índice, pero el esquema no solicita a Spanner que cree un índice de tokens para sus posibles valores. Por lo tanto, el predicado de texto completo enTitley el predicado que no es de texto enRatingse aceleran, pero el predicado enLikesno. En Spanner, la consulta recupera todos los documentos que contienen el término "car" enTitley una calificación superior a 4, y, luego, filtra los documentos que no tienen al menos 1,000 Me gusta. Esta consulta usa muchos recursos si casi todos los álbumes tienen el término "auto" en su título y casi todos tienen una calificación de 5, pero pocos álbumes tienen 1,000 Me gusta. En esos casos, indexarLikesde manera similar aRatingahorra recursos.GoogleSQL
SELECT Album FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4 AND Likes >= 1000PostgreSQL
SELECT album FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4 AND likes >= 1000Coverno se almacena en el índice. La siguiente consulta realiza una unión inversa entreAlbumsIndexyAlbumspara recuperarCoverpara todos los álbumes coincidentes.GoogleSQL
SELECT AlbumId, Cover FROM Albums WHERE SEARCH(Title_Tokens, 'car') AND Rating > 4PostgreSQL
SELECT albumid, cover FROM albums WHERE spanner.search(title_tokens, 'car') AND rating > 4
¿Qué sigue?
- Obtén más información sobre las consultas de búsqueda de texto completo.
- Obtén más información para clasificar los resultados de la búsqueda.
- Obtén más información para realizar una búsqueda de subcadena.
- Obtén más información para paginar los resultados de la búsqueda.
- Obtén más información para buscar en varias columnas.