Muchas aplicaciones consultan una base de datos para completar una sola página en sus aplicaciones. En estas aplicaciones, no se necesitan todas las coincidencias, sino solo las k coincidencias principales según el orden de clasificación del índice. Los índices de búsqueda pueden implementar este tipo de búsqueda de manera muy eficiente. En esta página, se describe cómo crear y buscar un índice que tenga coincidencias de los k resultados más relevantes.
Crea índices de búsqueda para las coincidencias de los primeros K resultados
Para configurar un índice de búsqueda para la coincidencia de los k mejores resultados, usa ORDER BY para ordenar el índice de búsqueda por una columna específica. Las consultas deben tener una cláusula ORDER BY que coincida exactamente con el orden de clasificación del índice de búsqueda (incluida la dirección ascendente o descendente) y una cláusula LIMIT que solicite que la consulta se detenga después de encontrar k filas coincidentes.
También puedes implementar la paginación con estas cláusulas. Para obtener más información, consulta Cómo paginar las búsquedas.
En algunos casos de uso, puede ser conveniente mantener varios índices de búsqueda ordenados por diferentes columnas. Al igual que la partición, se trata de una compensación entre el costo de almacenamiento y escritura, y la latencia de las consultas.
Por ejemplo, considera una tabla que usa el siguiente esquema:
GoogleSQL
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
RecordTimestamp INT64 NOT NULL,
ReleaseTimestamp INT64 NOT NULL,
ListenTimestamp INT64 NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsRecordTimestampIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens)
STORING (ListenTimestamp)
ORDER BY RecordTimestamp DESC
CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
STORING (ListenTimestamp)
ORDER BY ReleaseTimestamp DESC
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
recordtimestamp bigint NOT NULL,
releasetimestamp bigint NOT NULL,
listentimestamp bigint NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN,
PRIMARY KEY(albumid));
CREATE SEARCH INDEX albumsrecordtimestampindex
ON Albums(albumtitle_tokens, singerid_tokens)
INCLUDE (listentimestamp)
ORDER BY recordtimestamp DESC
CREATE SEARCH INDEX albumsreleasetimestampindex
ON Albums(albumtitle_tokens)
INCLUDE (listentimestamp)
ORDER BY releasetimestamp DESC
Consulta los índices de búsqueda para obtener las k coincidencias principales
Como se mencionó anteriormente, las búsquedas deben tener una cláusula ORDER BY que coincida exactamente con el orden de clasificación del índice de búsqueda (incluida la dirección ascendente o descendente) y una cláusula LIMIT que solicite que la búsqueda se detenga después de encontrar k filas coincidentes.
En la siguiente lista, se analiza la eficiencia de algunas consultas comunes.
Esta consulta es muy eficiente. Selecciona el índice
AlbumsRecordTimestampIndex. Incluso si hay muchos álbumes con la palabra "feliz", la búsqueda solo explora una pequeña cantidad de filas:GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(albumtitle_tokens, 'happy') ORDER BY recordtimestamp DESC LIMIT 10La misma consulta, que solicita el orden de clasificación por
ReleaseTimestampen orden descendente, usa el índiceAlbumsReleaseTimestampIndexy es igual de eficiente:GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(albumtitle_tokens, 'happy') ORDER BY releasetimestamp DESC LIMIT 10Una consulta que solicita el orden de clasificación por
ListenTimestampno ejecuta una consulta de los k resultados principales de manera eficiente. Debe recuperar todos los álbumes coincidentes, ordenarlos porListenTimestamp,y devolver los 10 mejores. Una consulta de este tipo usa más recursos si hay una gran cantidad de documentos que contienen el término "feliz".GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(albumtitle_tokens, 'happy') ORDER BY listentimestamp DESC LIMIT 10Del mismo modo, una consulta no se ejecuta de manera eficiente si solicita que los resultados se ordenen con la columna
RecordTimestampen orden ascendente. Analiza todas las filas que contienen la palabra "feliz", a pesar de tener unLIMIT.GoogleSQL
SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp ASC LIMIT 10PostgreSQL
SELECT albumid FROM albums WHERE spanner.search(albumtitle_tokens, 'happy') ORDER BY recordtimestamp ASC LIMIT 10
¿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 paginar los resultados de la búsqueda.
- Obtén más información para combinar búsquedas de texto completo y búsquedas que no son de texto.
- Obtén más información para buscar en varias columnas.