Index scalaire
Milvus prend en charge les recherches filtrées combinant des champs scalaires et vectoriels. Pour améliorer l'efficacité des recherches impliquant des champs scalaires, Milvus a introduit l'indexation des champs scalaires à partir de la version 2.1.0. Cet article présente une vue d'ensemble de l'indexation des champs scalaires dans Milvus, vous aidant à comprendre sa signification et sa mise en œuvre.
Vue d'ensemble
Lorsque vous effectuez des recherches de similarité vectorielle dans Milvus, vous pouvez utiliser des opérateurs logiques pour organiser les champs scalaires en expressions booléennes.
Lorsque Milvus reçoit une demande de recherche avec une telle expression booléenne, il analyse l'expression booléenne dans un arbre syntaxique abstrait (AST) afin de générer un plan physique pour le filtrage des attributs. Milvus applique ensuite le plan physique dans chaque segment pour générer un jeu de bits comme résultat du filtrage et inclut le résultat comme paramètre de recherche vectorielle pour réduire la portée de la recherche. Dans ce cas, la vitesse des recherches vectorielles dépend fortement de la vitesse du filtrage d'attributs.
Filtrage d'attributs dans un segment
L'indexation des champs scalaires est un moyen d'assurer la rapidité du filtrage des attributs en triant les valeurs des champs scalaires d'une manière particulière afin d'accélérer la recherche d'informations.
Algorithmes d'indexation des champs scalaires
Milvus vise à obtenir une faible utilisation de la mémoire, une grande efficacité de filtrage et un temps de chargement court grâce à ses algorithmes d'indexation des champs scalaires. Ces algorithmes sont classés en deux catégories principales : l'indexation automatique et l'indexation inversée.
Indexation automatique
Milvus propose l'option AUTOINDEX
pour vous éviter de devoir choisir manuellement un type d'index. Lors de l'appel de la méthode create_index
, si l'option index_type
n'est pas spécifiée, Milvus sélectionne automatiquement le type d'index le plus approprié en fonction du type de données.
Le tableau suivant répertorie les types de données pris en charge par Milvus et les algorithmes d'indexation automatique correspondants.
Type de données | Algorithme d'indexation automatique |
---|---|
VARCHAR | Index inversé |
INT8 | Index inversé |
INT16 | Index inversé |
INT32 | Indice inversé |
INT64 | Indice inversé |
FLOAT | Indice inversé |
DOUBLE | Index inversé |
Indexation inversée
L'indexation inversée offre un moyen flexible de créer un index pour un champ scalaire en spécifiant manuellement les paramètres de l'index. Cette méthode fonctionne bien pour différents scénarios, y compris les requêtes ponctuelles, les requêtes de correspondance de motifs, les recherches en texte intégral, les recherches JSON, les recherches booléennes et même les requêtes de correspondance de préfixes.
Les index inversés mis en œuvre dans Milvus sont alimentés par Tantivy, une bibliothèque de moteur de recherche en texte intégral. Tantivy garantit que l'indexation inversée dans Milvus est à la fois efficace et rapide.
Un index inversé se compose de deux éléments principaux : un dictionnaire de termes et une liste inversée. Le dictionnaire de termes comprend tous les mots tokenisés triés par ordre alphabétique, tandis que la liste inversée contient la liste des documents dans lesquels chaque mot apparaît. Cette configuration rend les requêtes ponctuelles et les requêtes par plage beaucoup plus rapides et efficaces que les recherches par force brute.
Schéma de l'index inversé
Les avantages de l'utilisation d'un index inversé sont particulièrement évidents dans les opérations suivantes :
- Requête ponctuelle: Par exemple, lors de la recherche de documents contenant le mot Milvus, le processus commence par vérifier si Milvus est présent dans le dictionnaire des termes. S'il n'est pas trouvé, aucun document ne contient le mot. En revanche, s'il est trouvé, la liste inversée associée à Milvus est récupérée, indiquant les documents qui contiennent le mot. Cette méthode est beaucoup plus efficace qu'une recherche brute dans un million de documents, car le dictionnaire de termes triés réduit considérablement le temps nécessaire pour trouver le mot Milvus.
- Interrogation par plage: L'efficacité des requêtes de portée, telles que la recherche de documents contenant des mots alphabétiquement supérieurs à très, est également améliorée par le dictionnaire de termes triés. Cette approche est plus efficace qu'une recherche brute et fournit des résultats plus rapides et plus précis.
Résultats des tests
Pour démontrer les améliorations de performances apportées par les index scalaires dans Milvus, une expérience a été menée pour comparer les performances de plusieurs expressions utilisant l'indexation inversée et la recherche par force brute sur des données brutes.
L'expérience a consisté à tester diverses expressions dans deux conditions : avec un index inversé et avec une recherche par force brute. Pour garantir l'équité, la même distribution des données a été maintenue entre les tests, en utilisant la même collection à chaque fois. Avant chaque test, la collection a été libérée et l'index a été supprimé et reconstruit. En outre, une requête à chaud a été effectuée avant chaque test pour minimiser l'impact des données froides et chaudes, et chaque requête a été exécutée plusieurs fois pour garantir la précision.
Pour un ensemble de données d'un million d' enregistrements, l'utilisation d'un index inversé peut améliorer jusqu'à 30 fois les performances pour les requêtes ponctuelles. Les gains de performance peuvent être encore plus significatifs pour des ensembles de données plus importants.
Recommandations en matière de performances
Pour tirer pleinement parti des capacités de Milvus en matière d'indexation de champs scalaires et libérer sa puissance dans les recherches de similarité vectorielle, vous pouvez avoir besoin d'un modèle pour estimer la taille de la mémoire requise en fonction des données dont vous disposez.
Les tableaux suivants répertorient les fonctions d'estimation pour tous les types de données pris en charge par Milvus.
Champs numériques
Type de données Fonction d'estimation de la mémoire (Mo) INT8 numOfRows * 12 / 1024 / 1024 INT16 numOfRows * 12 / 1024 / 1024 INT32 numOfRows * 12 / 1024 / 1024 INT64 numOfRows * 24 / 1024 / 1024 FLOAT32 numOfRows * 12 / 1024 / 1024 DOUBLE numOfRows * 24 / 1024 / 1024 Champs de la chaîne
Longueur de la chaîne Fonction d'estimation de la mémoire (MB) (0, 8] numOfRows * 128 / 1024 / 1024 (8, 16] numOfRows * 144 / 1024 / 1024 (16, 32] numOfRows * 160 / 1024 / 1024 (32, 64] numOfRows * 192 / 1024 / 1024 (64, 128] numOfRows * 256 / 1024 / 1024 (128, 65535] numOfRows * strLen * 1.5 / 1024 / 1024
Et ensuite
Pour indexer un champ scalaire, lisez Construire un index sur des scalaires.
Pour en savoir plus sur les termes et les règles mentionnés ci-dessus, lisez