Exécution de requêtes conditionnelles
Ce sujet explique comment exécuter des requêtes conditionnelles, similaires aux conditions WHERE en SQL.
Contrairement à la recherche de similarité de vecteurs, les requêtes récupèrent des vecteurs en utilisant des filtres scalaires avec des expressions booléennes. Milvus prend en charge divers types de données dans les champs scalaires et une variété d'expressions booléennes. Les expressions booléennes peuvent filtrer les champs scalaires ou les champs de clé primaire et récupérer tous les résultats correspondant aux conditions de filtre.
L'exemple suivant démontre comment exécuter une requête sur un ensemble de données contenant 2000 lignes, comprenant l'ID du livre (clé primaire), le nombre de mots (champ scalaire) et l'introduction du livre (champ vectoriel). Il simule la recherche de livres spécifiques en fonction de leurs ID.
Chargement de la collection
Dans Milvus, toutes les opérations de recherche et de requête sont effectuées en mémoire. Avant d'effectuer une requête, la collection doit être chargée en mémoire.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("Échec du chargement de la collection :", err.Error())
}
Exécution de la requête
L'exemple suivant filtre les vecteurs en fonction de valeurs spécifiques de book_id
et renvoie les champs book_id
et book_intro
des résultats.
Milvus prend en charge le paramétrage des niveaux de cohérence pour les requêtes. Cet exemple définit le niveau de cohérence sur Strong
. Vous pouvez également définir le niveau de cohérence sur Bounded
, Session
ou Eventually
. Pour plus d'informations sur les quatre niveaux de cohérence dans Milvus, consultez Cohérence.
Vous pouvez également utiliser des champs dynamiques dans les expressions de filtre et des champs de sortie dans la requête. Par exemple, consultez le modèle dynamique.
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
queryResult, err := milvusClient.Query(
context.Background(), // ctx
"book", // CollectionName
"", // PartitionName
entity.NewColumnInt64("book_id", []int64{2,4,6,8}), // expr
[]string{"book_id", "book_intro"}, // OutputFields
opt, // queryOptions
)
if err != nil {
log.Fatal("Échec de la requête sur la collection :", err.Error())
}
Paramètre | Description | Options |
---|---|---|
ctx |
Contexte utilisé pour contrôler le processus d'appel de l'API. | N/A |
CollectionName |
Nom de la collection à interroger. | N/A |
PartitionName |
Noms des partitions à charger. Si vide, interrogez toutes les partitions. | N/A |
expr |
Expression booléenne utilisée pour filtrer les attributs. | Pour plus d'informations, consultez Règles d'expression booléenne. |
OutputFields |
Noms des champs à retourner. | Les champs vectoriels ne sont pas pris en charge dans la version actuelle. |
opts |
Options de requête représentées sous la forme de entity.SearchQueryOptionFunc . |
- Limit indique le nombre d'entités à retourner. - Offset indique le nombre d'entités à sauter lors du processus de recherche. La somme de ce paramètre et de Limit doit être inférieure à 16384 . - ConsistencyLevel indique le niveau de cohérence à appliquer lors du processus de recherche. - Ignore Growing indique s'il faut ignorer le segment en croissance lors du processus de recherche de similarité. La valeur par défaut est False , indiquant que la recherche inclut le segment en croissance. |
Vérifiez le résultat retourné.
fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
fmt.Println(qr.IDs)
}
Calcul de la quantité d'entités
Lors de l'exécution d'une requête, vous pouvez ajouter count(*)
à output_fields
, afin que Milvus puisse retourner la quantité d'entités dans la collection. Si vous souhaitez compter la quantité d'entités répondant à des conditions spécifiques, utilisez expr
pour définir une expression booléenne.
Restrictions
Lors de l'utilisation de count(*)
dans output_fields
, l'utilisation du paramètre limit
n'est pas autorisée.