Muchas aplicaciones consultan una base de datos para propagar una sola página en sus aplicaciones. En esas aplicaciones, la aplicación no necesita todas las coincidencias, sino solo las coincidencias Top-K según el orden de clasificación del índice. Buscar índices implementar este tipo de búsquedas de manera muy eficiente. En esta página, se describe cómo crear y buscar un índice que tenga coincidencias Top-K.
Crea índices de búsqueda para coincidencias Top-K
Si quieres configurar un índice de búsqueda para la coincidencia de Top-K, usa ORDER BY
para ordenar la
de búsqueda basado en 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 filas que coincidan con k.
También puedes implementar la paginación con estas cláusulas. Para obtener más información, consulta Pagina las búsquedas.
Para algunos casos de uso, puede tener sentido mantener varios índices de búsqueda. ordenados por columnas diferentes. Me gusta partición, hay un equilibrio entre el costo de almacenamiento y de escritura frente a la latencia de la consulta.
Por ejemplo, considera una tabla que usa el siguiente esquema:
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)
ORDER BY RecordTimestamp DESC
STORING ListenTimestamp
CREATE SEARCH INDEX AlbumsReleaseTimestampIndex
ON Albums(AlbumTitle_Tokens)
ORDER BY ReleaseTimestamp DESC
STORING ListenTimestamp
Consultar índices de búsqueda para coincidencias k superior
Como se indicó anteriormente, 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 filas que coincidan con k.
Las siguientes son algunas consultas comunes:
La siguiente consulta es muy eficiente. Selecciona el índice
AlbumsRecordTimestampIndex
. Incluso si hay muchos álbumes con la palabra "feliz", la consulta solo analiza una pequeña cantidad de filas:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10
La misma consulta, solicitando el orden de clasificación por
ReleaseTimestamp
en orden descendente ordenado, usa el índiceAlbumsReleaseTimestampIndex
y es igual eficiente:SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10
Al mismo tiempo, una consulta que solicita un orden de clasificación por
ListenTimestamp
no ejecutar una consulta Top-K con eficiencia. Debe recuperar todos los álbumes que coincidan, ordenarlos porListenTimestamp,
y mostrar los 10 principales. Una consulta de este tipo usa más recursos si hay una gran cantidad de documentos que contienen el término “feliz”.SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10`
Del mismo modo, una consulta no se ejecuta de manera eficiente si solicita que los resultados se ordenen con la columna
RecordTimestamp
en orden ascendente. Escanea todo filas con la palabra "happy", a pesar de tener unLIMIT
.SELECT AlbumId FROM Albums WHERE 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.
- Obtenga información sobre cómo 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 sobre cómo combinar consultas de texto completo y no de texto.
- Obtén más información sobre cómo buscar en varias columnas.