Recherche de similarité vectorielle
Ce sujet présente comment effectuer une recherche d'entité dans Milvus.
La recherche de similarité vectorielle dans Milvus calcule la distance entre le vecteur de requête et les vecteurs de la collection, et renvoie les résultats les plus similaires. Vous pouvez également effectuer une recherche mixte en spécifiant une expression booléenne pour filtrer les champs scalaires ou les champs de clés primaires.
L'exemple suivant montre comment effectuer une recherche de similarité vectorielle sur un ensemble de données de 2000 lignes, composé d'IDs de livres (clé primaire), de fréquence de mots (champ scalaire) et de descriptions de livres (champ vectoriel). Cela simule le scénario de recherche de livres spécifiques basée sur des descriptions vectorisées. Milvus renverra les résultats les plus similaires en fonction du vecteur de requête défini et des paramètres de recherche.
Chargement de la collection
Avant d'effectuer une recherche de similarité vectorielle, Milvus exécute toutes les opérations de recherche et de requête en mémoire. Veuillez charger la collection en mémoire avant d'effectuer une recherche de similarité vectorielle.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // NomCollection
false // asynchrone
)
if err != nil {
log.Fatal("échec du chargement de la collection:", err.Error())
}
Préparation des paramètres de recherche
Préparez des paramètres adaptés à votre scénario de recherche. L'exemple suivant définit l'utilisation de la distance euclidienne pour calculer la distance et la récupération des vecteurs depuis les dix clusters les plus proches construits par l'index IVF_FLAT.
sp, _ := entity.NewIndexIvfFlatSearchParam( // Fonction NewIndex*SearchParam
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Paramètre | Description | Options |
---|---|---|
Fonction NewIndex*SearchParam |
Fonction pour créer entity.SearchParam basée sur différents types d'index. |
Pour les vecteurs flottants : - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Pour les vecteurs binaires : - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Paramètres de recherche spécifiques à l'index retournés par la fonction précédente. | Voir l'index vectoriel pour plus de détails. |
opt |
Options de recherche ANN. | - Limit : Spécifie le nombre d'entités à renvoyer. - Offset : Spécifie le nombre d'entités à sauter lors de la recherche. La somme de ce paramètre et de Limit doit être inférieure à 16384. Par exemple, si vous voulez interroger les 9ème et 10ème voisins les plus proches d'un vecteur, réglez Limit sur 2 et Offset sur 8 . - ConsistencyLevel : Spécifie le niveau de cohérence appliqué lors de la recherche. - Ignorer croissance : Indique s'il faut ignorer les segments en croissance dans la recherche de similarité. La valeur par défaut est False , indiquant que la recherche implique des segments en croissance. |
Effectuer une recherche vectorielle
Effectuez une recherche vectorielle à l'aide de Milvus. Pour rechercher dans une partition spécifique, veuillez spécifier la liste des noms de partition.
Milvus prend en charge le paramétrage d'un niveau de cohérence pour la recherche. L'exemple dans ce sujet définit le niveau de cohérence sur Fort
. Vous pouvez également définir le niveau de cohérence sur Limité
, Session
ou Éventuellement
. Pour plus d'informations sur les quatre niveaux de cohérence dans Milvus, consultez la section Cohérence.
resultatRecherche, err := milvusClient.Search(
context.Background(), // ctx
"livre", // CollectionName
[]string{}, // partitionNames
"", // expr
[]string{"book_id"}, // outputFields
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
"book_intro", // vectorField
entity.L2, // metricType
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("Échec de la recherche dans la collection:", err.Error())
}
Paramètre | Description | Options |
---|---|---|
ctx |
Contexte utilisé pour contrôler le processus d'appel à l'API | N/A |
CollectionName |
Nom de la collection à charger | N/A |
partitionNames |
Liste des noms de partition à charger. Si vide, recherche toutes les partitions | N/A |
expr |
Expression booléenne pour filtrer les propriétés | Voir les règles d'expression booléenne pour des informations détaillées |
outputFields |
Noms des champs à retourner | N/A |
vectors |
Vecteurs à rechercher | N/A |
vectorField |
Nom du champ à rechercher | N/A |
metricType |
Type de métrique utilisé pour la recherche | Ce paramètre doit être le même que le type de métrique utilisé pour construire l'index |
topK |
Nombre de résultats à retourner. La somme de cette valeur et de offset dans opts doit être inférieure à 16384 |
N/A |
sp |
entity.SearchParam spécifique à l'index |
N/A |
Vérifiez les valeurs des clés primaires et les distances des vecteurs les plus similaires.
fmt.Printf("%#v\n", resultatRecherche)
for _, sr := range resultatRecherche {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
Une fois la recherche terminée, libérez la collection chargée dans Milvus pour réduire la consommation de mémoire.
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"livre", // CollectionName
)
if err != nil {
log.Fatal("Échec de la libération de la collection :", err.Error())
}
Limitations
Caractéristique | Limite maximale |
---|---|
Longueur du nom de collection | 255 caractères |
Nombre de partitions dans une collection | 4 096 |
Nombre de champs dans une collection | 256 |
Nombre de fragments dans une collection | 256 |
Dimensionnalité des vecteurs | 32 768 |
Top K | 16 384 |
Nombre de vecteurs d'entrée cibles | 16 384 |
Réaliser une recherche mixte
La recherche mixte est essentiellement une recherche vectorielle avec un filtrage d'attributs. En spécifiant une expression booléenne pour filtrer les champs scalaires ou les champs de clé primaire, vous pouvez limiter la recherche en fonction de conditions spécifiques.
L'exemple suivant montre comment réaliser une recherche mixte basée sur une recherche vectorielle régulière. Supposons que vous souhaitiez rechercher des livres spécifiques en fonction de l'introduction vectorisée des livres, mais que vous souhaitiez seulement récupérer des livres dans une plage spécifique de mots. Vous pouvez alors filtrer le champ word_count
en spécifiant une expression booléenne dans les paramètres de recherche. Milvus ne recherchera que des vecteurs similaires parmi les entités qui correspondent à l'expression.
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
resultatRecherche, err := milvusClient.Search(
context.Background(),
"livre",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("Échec de la recherche dans la collection:", err.Error())
}
Vérifiez les résultats retournés.
fmt.Printf("%#v\n", resultatRecherche)
for _, sr := range resultatRecherche {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}