Cette rubrique explique comment configurer et utiliser le mode de rappel par cluster vectoriel : créer une collection, précréer des backings, enregistrer les centroïdes de slice, écrire des données vectorielles, sélectionner automatiquement les slices candidates au moment de la requête et contrôler la récupération vectorielle au sein des slices sélectionnées. Pour plus d'informations sur le positionnement de la fonctionnalité, les scénarios et le choix du mode, consultez .
Le paramètre de création slice_strategy=vector_cluster détermine le mode et ne peut pas être modifié après la création de la collection. Pour basculer une collection existante vers un autre mode, créez une nouvelle collection et importez à nouveau les données. Pour les API générales de gestion et de données, consultez Référence API.
Les sections ci-dessous suivent l'ordre d'exécution du flux de travail. Une contrainte d'ordonnancement est obligatoire : conservez auto_create_slice=false, enregistrez les centroïdes de slice, puis écrivez les données. Un slice sans centroïde ne participe jamais à la sélection automatique des slices candidates ; par conséquent, les données écrites dans un tel slice ne peuvent jamais être rappelées automatiquement.
Créer une collection
En mode de rappel par cluster vectoriel, chaque cluster vectoriel correspond à un slice, et le centroïde du cluster est enregistré comme centroïde de ce slice. L'exemple suivant utilise trois clusters vectoriels construits manuellement pour vérifier le flux de travail. Deux slices candidates sont interrogées par défaut, et au maximum trois slices peuvent être interrogées. Ces valeurs s'appliquent uniquement à cet exemple. Dans un environnement de production, utilisez les résultats réels du clustering et déterminez le nombre de slices candidates en fonction du rappel, de la latence et de la consommation de ressources.
PUT /_slice_collection/products
{
"slice_strategy": "vector_cluster",
"auto_create_slice": false,
"settings": {
"index.number_of_shards": 2,
"index.number_of_replicas": 2
},
"mappings": {
"properties": {
"cluster_id": { "type": "keyword" },
"name": { "type": "keyword" },
"embedding": {
"type": "dense_vector",
"dims": 2,
"index": true,
"similarity": "cosine",
"index_options": {
"type": "bbq_disk"
}
}
}
},
"config": {
"routing_field": "cluster_id",
"vector_dims": 2,
"default_query_vector_path": "knn.query_vector",
"default_query_slice_count": 2,
"max_query_slice_count": 3
}
}
config est un paramètre obligatoire du mode de rappel par cluster vectoriel :
|
Paramètre config |
Obligatoire |
Description |
|
|
Non |
Lit le slice à partir d'un champ de premier niveau du document écrit. Les chemins imbriqués au format |
|
|
Oui |
Les dimensions vectorielles du centroïde de slice. Valeurs valides : 1 à 4096. Les dimensions de chaque centroïde que vous enregistrez doivent correspondre à cette valeur. |
|
|
Oui |
Le chemin du vecteur de requête dans la demande. Valeurs valides : |
|
|
Non |
Le nombre par défaut de slices candidates par requête. Valeur par défaut : |
|
|
Non |
Le nombre maximal de slices candidates autorisées dans une seule requête. Le paramètre |
Si vous transmettez un config non vide en mode namespace, qui utilise la valeur slice_strategy exact, une erreur HTTP 400 est renvoyée.
vector_dims spécifie les dimensions du centroïde, tandis que mappings utilise dense_vector.dims pour spécifier les dimensions des vecteurs de document. Lors de la sélection automatique de slice, le vecteur de requête spécifié par default_query_vector_path doit avoir les mêmes dimensions que le centroïde. Cet exemple utilise le même knn.query_vector pour la sélection de slice et la récupération de documents, donc les deux dimensions sont définies sur 2 et le même modèle vectoriel est utilisé. La modification de vector_dims seul ne réduit pas automatiquement les dimensions des vecteurs existants.
Les autres paramètres de création, tels que settings, mappings et les paramètres de capacité, sont identiques à ceux du mode namespace. Pour plus d'informations, consultez Référence de gestion des collections. Notez les deux différences suivantes dans les valeurs par défaut :
|
Paramètre |
Valeur par défaut en mode namespace |
Valeur par défaut en mode de rappel par cluster vectoriel |
|
|
|
|
|
|
|
|
auto_create_slice est désactivé par défaut car un cluster vectoriel doit enregistrer un centroïde avant de pouvoir participer à la sélection automatique de slice. La création automatique lors d'une écriture produit des slices sans centroïde, dont les données ne peuvent jamais être rappelées automatiquement. À moins que votre activité ne puisse accepter ce comportement, conservez auto_create_slice=false, enregistrez d'abord les centroïdes, puis écrivez les données.
Précréer des backings (facultatif, recommandé)
Les backings sont créés à la demande par défaut. Avant une importation en masse, précréez cinq index sous-jacents afin que les données des nouveaux clusters vectoriels soient réparties entre eux et que l'attente liée à la création d'index lors de la première écriture soit réduite. Dans un environnement de production, ajustez le nombre en fonction de la croissance des clusters vectoriels, du volume de données et des ressources de shard.
PUT /_slice_collection/products/backings?count=5
Vérifiez que acknowledged=true et que backings contient cinq index. La précréation ne migre pas les slices existantes et ne génère pas de centroïdes. Pour plus d'informations sur la sémantique de l'ajout de backings supplémentaires et les modifications de la politique d'allocation, consultez Précréer des backings.
Enregistrer les centroïdes de slice
Chaque slice qui participe à la sélection automatique de slice doit avoir un centroïde. Vous ne pouvez pas ignorer cette étape. La récupération de centroïde exécute toujours une recherche de plus proches voisins approximatifs (ANN) avec la similarité cosine et un index bbq_disk. Elle ne change pas avec le paramètre similarity du champ de vecteur de document.
Enregistrer un centroïde de slice unique
La demande suivante enregistre le centroïde du slice cluster-a :
PUT /_slice_collection/products/slices/cluster-a
{
"vector": [0.9, 0.1]
}
Une réponse HTTP réussie ne garantit pas que le centroïde a été créé. Comme décrit dans Vérifier les résultats d'enregistrement (unique et par lot), vérifiez le champ errors de premier niveau et le result de chaque élément dans items.
Enregistrer des centroïdes de slice par lots
Une tâche de clustering hors ligne génère généralement plusieurs centroïdes de clusters vectoriels simultanément. Utilisez l'API par lot pour les enregistrer en une seule demande :
PUT /_slice_collection/products/slices
{
"slices": [
{ "slice": "cluster-b", "vector": [0.1, 0.9] },
{ "slice": "cluster-c", "vector": [0.6, 0.4] }
]
}
Le nom de slice de chaque élément peut être spécifié par slice ou slice_id, mais un seul d'entre eux peut apparaître dans le même élément. Vous pouvez enregistrer jusqu'à 20 480 slices dans une seule demande, et les noms de slice doivent être uniques au sein de la demande.
Vérifier les résultats d'enregistrement (unique et par lot)
L'API d'enregistrement unique et l'API d'enregistrement par lot peuvent signaler des erreurs au niveau des éléments dans une réponse HTTP 200, y compris une incompatibilité entre les dimensions du centroïde et config.vector_dims. Une demande HTTP réussie ne signifie pas que tous les clusters vectoriels ont été enregistrés avec succès. En plus de gérer les réponses non-2xx, vérifiez le champ errors de premier niveau et, pour chaque élément dans items, son result : created indique que le centroïde a été créé, updated indique que le centroïde a été mis à jour, noop indique que le contenu n'a pas changé, et failed indique un échec. Un élément ayant échoué contient un champ error de type chaîne et ne contient pas le champ backing_index présent dans un élément réussi.
{
"acknowledged": true,
"errors": false,
"items": [
{
"slice_id": "cluster-b",
"result": "created",
"backing_index": ".sc-products-...-00000"
},
{
"slice_id": "cluster-c",
"result": "created",
"backing_index": ".sc-products-...-00001"
}
]
}
Les dimensions de chaque centroïde doivent correspondre à config.vector_dims. Un slice sans centroïde peut toujours être accédé explicitement, mais il ne participe pas à la sélection automatique des slices candidates. Lorsque vous enregistrez à nouveau un slice avec le même nom, updated est renvoyé si le centroïde a changé, et noop est renvoyé s'il n'a pas changé. Dans les deux cas, les documents déjà écrits ne sont pas déplacés.
Écrire des données vectorielles
La manière dont vous écrivez les documents dépend de la configuration ou non de routing_field lors de la création de la collection. Si routing_field est configuré, le système lit le slice à partir d'un champ de premier niveau de chaque document. S'il n'est pas configuré, chaque demande d'écriture ou élément Bulk doit spécifier explicitement _slice, comme en mode namespace.
Les demandes d'écriture régulières ne doivent pas passer refresh, et le code d'application ne doit pas appeler _refresh. Attendez que l'actualisation automatique en arrière-plan rende les données consultables. Pour connaître les conditions dans lesquelles une attente synchrone est autorisée, consultez Actualisation et visibilité des requêtes.
Écrire des documents avec routing_field
Après avoir configuré routing_field, le système lit le slice à partir d'un champ de premier niveau du document, et vous n'avez plus besoin de passer _slice :
PUT /products/_doc/product-1
{
"cluster_id": "cluster-a",
"name": "example-product",
"embedding": [0.92, 0.08]
}
Vous pouvez également fournir explicitement _slice=cluster-a, et les API compatibles acceptent également routing=cluster-a. Si vous spécifiez explicitement un slice, la valeur doit correspondre à la valeur du champ de document spécifié par routing_field (cluster_id dans cet exemple). Sinon, une erreur HTTP 400 est renvoyée.
Mettre à jour des documents
Après avoir configuré routing_field, les mises à jour scriptées ne sont pas prises en charge. Pour modifier uniquement certains champs, utilisez l'API _update avec un corps de demande doc et portez explicitement un _slice correspondant. Si une nouvelle valeur doit être calculée à partir d'une ancienne valeur, lisez l'ancienne valeur dans votre application, calculez la nouvelle valeur et réécrivez-la. Utilisez if_seq_no et if_primary_term pour le contrôle de concurrence afin d'éviter que votre mise à jour n'écrase les mises à jour d'autres demandes.
Réécrire des documents après Copy ou Branch
Les fonctionnalités Copy et Branch conservent toutes deux la valeur routing_field dans un document. Lorsque vous réécrivez ultérieurement un document dans le slice de destination, spécifiez explicitement la destination et assurez-vous que le champ de routage dans le document écrit correspond à la destination. Cela empêche le document d'être réécrit dans le slice source ou de déclencher une erreur de validation. Pour plus d'informations, consultez Sémantique de copie des données.
Écrire des documents sans routing_field
Si routing_field n'est pas configuré, les données sont écrites de la même manière qu'en mode namespace : chaque demande d'écriture ou élément Bulk doit spécifier explicitement _slice. Pour les autres comportements d'écriture, tels que Bulk, la visibilité Refresh, _update_by_query et _delete_by_query, consultez Opérations d'écriture, de lecture et de requête de documents.
Sélectionner automatiquement les slices candidates
Lorsqu'une requête fournit un vecteur au chemin configuré, le mode de rappel par cluster vectoriel sélectionne automatiquement les slices candidates à rechercher. Les données nouvellement écrites deviennent consultables uniquement après l'actualisation automatique en arrière-plan : après l'écriture, attendez environ 5 secondes, et si les résultats ne contiennent pas encore les nouvelles données, attendez un cycle d'actualisation automatique supplémentaire et réessayez.
Exécuter une requête
Utilisez un vecteur de requête pour sélectionner automatiquement les slices candidates :
POST /products/_search?query_slice_count=2
{
"knn": {
"field": "embedding",
"query_vector": [0.91, 0.09],
"k": 10,
"num_candidates": 100
}
}
Vérifiez que timed_out=false et _shards.failed=0, et que hits.hits contient product-1 écrit dans cet exemple.
Le tableau suivant décrit les paramètres de sélection automatique des slices candidates :
|
Paramètre |
Description |
|
|
Le nombre de slices candidates sélectionnées pour cette requête. Si ce paramètre est omis ou défini sur |
|
|
Remplace le chemin par défaut du vecteur de requête de la collection. Valeurs valides : |
Une demande utilise uniquement le vecteur de requête sélectionné par le chemin configuré pour déterminer les slices candidates de l'ensemble de la demande. Plusieurs clauses KNN ne sélectionnent pas les slices séparément puis ne prennent pas l'union des ensembles de slices sélectionnés. Les autres clauses de requête KNN ou hybrides sont également limitées à cet ensemble de slices candidates.
Si query_slice_count est explicitement défini sur une valeur non nulle, la valeur doit se situer dans la plage de 1 à max_query_slice_count. Sinon, une erreur HTTP 400 est renvoyée.
Si la demande spécifie explicitement _slice ou le paramètre compatible routing, la requête s'exécute dans la portée spécifiée, que ces slices aient ou non enregistré des centroïdes. L'exigence de centroïde s'applique uniquement à la sélection automatique des slices candidates : seules les slices ayant un centroïde enregistré sont prises en compte.
Lorsque le paramètre de cluster apack.slice_collection.search.default_to_all_slices est désactivé, ce qui est le cas par défaut, une erreur HTTP 400 est renvoyée si le chemin configuré n'a pas de vecteur de requête. Dans ce cas, spécifiez explicitement _slice. Après avoir activé ce paramètre, un vecteur de requête manquant revient à interroger toutes les slices. Pour les requêtes de production régulières, conservez ce paramètre désactivé et ne comptez pas sur le repli sur toutes les slices. Un chemin invalide, l'utilisation de query_vector_builder pour fournir le vecteur de requête, ou des dimensions de vecteur de requête qui ne correspondent pas à vector_dims renvoient toujours une erreur HTTP 400, et ce paramètre ne peut pas contourner ces erreurs. Pour plus d'informations sur le paramètre, consultez Spécifier la portée de la requête.
Le corps de la demande de l'API Count (_count) ne contient pas le vecteur de requête en ligne requis pour la sélection automatique de slice, donc le slice ne peut pas être sélectionné automatiquement. Tant que le repli sur toutes les slices reste désactivé par défaut, vous devez fournir explicitement _slice. Les autres requêtes qui ne contiennent pas de vecteur de requête doivent également spécifier explicitement la portée.
Préchauffer les slices candidates connues (facultatif)
Si vous pouvez prédire quels clusters seront accessibles, préchauffez-les d'abord pour réduire la latence de la première requête sur des données froides. Dans cet exemple, un seul document est écrit dans cluster-a, vous pouvez donc le préchauffer une fois :
POST /products/_warm_slice?_slice=cluster-a&wait_for_completion=true&timeout=60s
Vérifiez que la demande aboutit et que _shards.failed=0. Si _shards.total=0, vérifiez d'abord que les shards de requête sont disponibles et utilisez une requête réelle pour confirmer que les données sont consultables, puis réessayez le préchauffage si nécessaire. Des données ont déjà été écrites dans cet exemple. L'attente synchrone est utilisée uniquement pour vérifier cet exemple. Dans un environnement de production, préchauffez une portée d'accès prévisible de manière asynchrone à l'avance et contrôlez la concurrence. N'itérez pas et ne préchauffez pas tous les clusters avant chaque requête de sélection automatique de cluster. Pour plus d'informations, consultez Mettre en cache le slice.
Erreurs HTTP 400 courantes
Lorsqu'une demande renvoie une erreur HTTP 400, comparez la demande aux causes courantes suivantes :
|
Cause |
Section |
|
|
Créer une collection |
|
Un |
Créer une collection |
|
La valeur |
Écrire des données vectorielles |
|
|
Sélectionner automatiquement les slices candidates |
|
Le chemin configuré n'a pas de vecteur de requête alors que |
Sélectionner automatiquement les slices candidates |
|
Le chemin du vecteur de requête est invalide, |
Sélectionner automatiquement les slices candidates |
Récupération vectorielle au sein d'un slice
query_slice_count contrôle le nombre de slices candidates, tandis que le type d'index du champ de vecteur de document, visit_percentage et num_candidates contrôlent KNN au sein de la portée sélectionnée. Pour les paramètres de champ et de requête, consultez Champs vectoriels et KNN. Pour la répartition des responsabilités entre les deux capacités et comment choisir entre elles, consultez Relation avec DiskBBQ.