Recherche vectorielle de base avec StructArray
Utilisez cette page pour effectuer une recherche vectorielle sur les sous-champs vectoriels d’un champ StructArray. StructArray prend en charge deux modes de recherche vectorielle de base : la recherche EmbeddingList, qui évalue une liste d’embeddings stockée dans chaque entité, et la recherche au niveau des éléments, qui explore chaque élément Struct indépendamment.
Cette page utilise la collection « tech_articles » issue de la section « Créer un champ StructArray ». Cette collection comporte un champ StructArray nommé « chunks ». Chaque bloc contient du texte, des métadonnées scalaires, un sous-champ vectoriel nommé « emb_list_vector » avec un index pour la recherche EmbeddingList, et un sous-champ vectoriel nommé « emb » avec un index pour la recherche au niveau des éléments.
Avant de commencer
Assurez-vous que le schéma de la collection, les données et les index sont déjà prêts.
| Prérequis | Où les préparer |
|---|---|
Créez un champ StructArray, tel que « chunks ». | Créer un champ StructArray |
Insérez des entités dont le champ « chunks » contient des objets Struct. | Insérer des données dans les champs StructArray |
Créez un index « MAX_SIM* » sur « chunks[emb_list_vector] » pour la recherche dans EmbeddingList. | Indexer les champs StructArray |
Créer un index vectoriel-métrique standard sur « chunks[emb] » pour la recherche au niveau des éléments. | Indexer les champs StructArray |
Avertissement
Un champ vectoriel ou un sous-champ vectoriel n'accepte qu'un seul index. Si vous avez besoin à la fois de la recherche EmbeddingList et de la recherche au niveau des éléments, créez deux sous-champs vectoriels distincts. Sur cette page, chunks[emb_list_vector] est indexé pour la recherche EmbeddingList, et chunks[emb] est indexé pour la recherche au niveau des éléments.
Choisissez un mode de recherche
| Aspect | Recherche dans EmbeddingList | Recherche au niveau des éléments |
|---|---|---|
| Sous-champ cible | chunks[emb_list_vector] | chunks[emb] |
| Données de requête | Une liste d'embeddings contenant un ou plusieurs vecteurs. | Un vecteur standard. |
| Famille de métriques | MAX_SIM*, telle que MAX_SIM_COSINE. | Des métriques vectorielles classiques, telles que COSINE, IP ou L2. |
| Ce que représente un résultat | Une entité correspondante dont le sous-champ vectoriel StructArray est similaire à la liste d’embeddings de la requête. | Un élément Struct correspondant à l’intérieur du champ StructArray. |
| Niveau de détail des résultats | Au niveau de l’entité. | Niveau de l'élément Struct. |
| Décalage | Sans objet. | Identifie la position (à partir de zéro) de l’élément Struct correspondant lors de son renvoi. |
| Utilisation typique | ColBERT, ColPali et autres modèles de recherche à interaction tardive. | Récupération au niveau des segments, des passages, des extraits, des fragments ou des faits. |
Lancer une recherche EmbeddingList
Utilisez la recherche EmbeddingList lorsque la requête elle-même contient plusieurs vecteurs et que le sous-champ du vecteur StructArray cible est indexé à l’aide d’une métrique de « MAX_SIM* ». Le résultat correspond à une correspondance au niveau de l’entité.
from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])
results = client.search(
collection_name="tech_articles",
data=[query],
anns_field="chunks[emb_list_vector]",
limit=3,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)
for hits in results:
for hit in hits:
print(hit["id"], hit["distance"], hit["entity"])
Dans ce mode de recherche, l’ limit contrôle le nombre d’entités renvoyées pour chaque requête. Le résultat peut inclure des sous-champs StructArray, mais le résultat de la recherche correspond à l’entité parente mise en correspondance plutôt qu’à un élément Struct spécifique.
Pour un guide complet de type ColBERT ou ColPali, consultez la section « Recherche avec des listes d’embeddings ». Cette page ne traite que du comportement de base de la recherche StructArray.
Lancer une recherche au niveau des éléments
Utilisez la recherche au niveau des éléments lorsque chaque élément Struct doit participer indépendamment à la recherche vectorielle. La requête est un vecteur standard, et le sous-champ du vecteur cible doit être indexé à l’aide d’une métrique vectorielle standard.
query_vector = [0.19, 0.24, 0.30, 0.37]
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[page]",
"chunks[quality_score]",
],
)
for hits in results:
for hit in hits:
print(
"doc_id:", hit["id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)
Dans la recherche au niveau des éléments, chaque résultat correspond à un élément Struct correspondant. La valeur « offset » correspond à la position (à partir de zéro) de cet élément dans le champ StructArray. Une même entité peut apparaître plusieurs fois si plusieurs éléments Struct correspondent à la requête. La valeur « limit » s’applique aux résultats au niveau des éléments, et non aux entités parentes uniques.
Interprétation des résultats
| Élément de résultat | Recherche EmbeddingList | Recherche au niveau des éléments |
|---|---|---|
id | Clé primaire de l’entité correspondante. | Clé primaire de l’entité contenant l’élément Struct correspondant. |
distance ou score | Score ou distance entre la liste d’embeddings de la requête et la liste d’embeddings stockée. | Score ou distance entre le vecteur de requête et le vecteur de l'élément Struct correspondant. |
offset | Sans objet. | Position (à partir de zéro) de l’élément Struct correspondant lors de son renvoi. |
| Clés primaires répétées | Non prévu pour une requête unique, car les résultats sont au niveau de l’entité. | Possible, car plusieurs éléments Struct d’une même entité peuvent correspondre. |
| Champs de sortie StructArray demandés | Renvoyés à partir de l’entité correspondante. | Renvoyés avec la forme de résultat au niveau des éléments prise en charge par l’API et le SDK cibles. |
Erreurs courantes
Utilisation de «
chunks.emb» au lieu de la syntaxe requise pour le chemin d’accès au sous-champ : «chunks[emb]».Utilisation d’une requête EmbeddingList sur un sous-champ vectoriel indexé avec une métrique vectorielle standard.
Utilisation d’une requête vectorielle standard sur un sous-champ vectoriel indexé avec une métrique de type «
MAX_SIM*».S’attendre à ce qu’une recherche au niveau des éléments (
limit) renvoie autant d’entités parentes uniques. Elle renvoie des résultats au niveau des éléments.S’attendre à ce qu’une recherche EmbeddingList renvoie un décalage d’élément spécifique. Elle renvoie des correspondances au niveau de l’entité.
Réutilisation d’un même sous-champ vectoriel pour les deux modes de recherche. Utilisez des sous-champs vectoriels distincts, car chaque sous-champ vectoriel n’accepte qu’un seul index.
Étapes suivantes
Pour restreindre la recherche au niveau des éléments à l’aide de conditions scalaires, consultez la section « Recherche filtrée avec StructArray ».
Pour effectuer une recherche par limites de score ou de distance, consultez la section « Recherche par plage avec StructArray ».
Pour renvoyer au maximum un résultat par entité parente après une recherche au niveau des éléments, consultez la section « Recherche groupée avec StructArray ».
Pour combiner la recherche StructArray avec d’autres recherches vectorielles, consultez la section « Recherche hybride avec StructArray ».
Pour connaître les types de données, les métriques, les filtres et les limites spécifiques à chaque version pris en charge, consultez la section « Limites de StructArray ».