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)
}