<ph type="x-smartling-placeholder">
De nombreuses applications interrogent une base de données pour renseigner une seule page dans leurs applications. Dans de telles applications, elles n'ont pas besoin mais uniquement les k premières correspondances basées sur l'ordre de tri de l'index. Rechercher des index pouvez mettre en œuvre ce type de recherche très efficacement. Cette page explique comment créer et rechercher un indice avec une correspondance top-k.
Créer des index de recherche pour les correspondances k premières
Pour configurer un indice de recherche pour la mise en correspondance des k premières valeurs, utilisez ORDER BY
pour trier l'indice de recherche par colonne spécifique. Les requêtes doivent comporter une clause ORDER BY
qui correspond exactement à l'ordre de tri de l'index de recherche (y compris l'ordre croissant
sens décroissant) et une clause LIMIT
qui demande à ce que la requête s'arrête après
trouver des lignes correspondant à k.
Vous pouvez également implémenter la pagination à l'aide de ces clauses. Pour en savoir plus, consultez Paginer les requêtes de recherche.
Dans certains cas d'utilisation, il peut être judicieux de gérer plusieurs index de recherche triés par différentes colonnes. J'aime partitionnement c'est un compromis entre les coûts de stockage et d'écriture et la latence des requêtes.
Prenons l'exemple d'une table qui utilise le schéma suivant:
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
Interroger les index de recherche pour obtenir les k premières correspondances
Comme indiqué précédemment, les requêtes doivent comporter une clause ORDER BY
qui correspond exactement à l'ordre de tri de l'index de recherche (y compris l'ordre croissant
sens décroissant) et une clause LIMIT
qui demande à ce que la requête s'arrête après
trouver des lignes correspondant à k.
Voici quelques requêtes courantes :
La requête suivante est très efficace. Elle sélectionne Index
AlbumsRecordTimestampIndex
. Même s'il existe de nombreux albums contenant le mot "heureux", la requête n'analyse qu'un petit nombre de lignes :SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp DESC LIMIT 10
La même requête, qui demande un ordre de tri par
ReleaseTimestamp
dans l'ordre décroissant, utilise l'indexAlbumsReleaseTimestampIndex
et est tout aussi efficace :SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ReleaseTimestamp DESC LIMIT 10
En même temps, une requête demandant un ordre de tri par
ListenTimestamp
ne une requête "top-k" efficacement. Elle doit extraire tous les albums correspondants, les trier parListenTimestamp,
et renvoyer le top 10. Une telle requête utilise plus de ressources si un grand nombre de documents contiennent le terme "heureux".SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY ListenTimestamp DESC LIMIT 10`
De même, une requête ne s'exécute pas efficacement si elle demande que les résultats soient triées à l'aide de la colonne
RecordTimestamp
dans l'ordre croissant. Il analyse l'intégralité lignes contenant le mot "happy" (heureux), malgré l'élémentLIMIT
.SELECT AlbumId FROM Albums WHERE SEARCH(AlbumTitle_Tokens, 'happy') ORDER BY RecordTimestamp ASC LIMIT 10
Étape suivante
- En savoir plus sur les requêtes de recherche en texte intégral
- Découvrez comment classer les résultats de recherche.
- Découvrez comment paginer les résultats de recherche.
- Découvrez comment combiner des requêtes de texte complet et non textuelles.
- Découvrez comment effectuer une recherche dans plusieurs colonnes.