L'équipe Alibaba Cloud Elasticsearch a développé le plug-in aliyun-knn, un moteur de recherche vectorielle basé sur la bibliothèque vectorielle Proxima d'Alibaba DAMO Academy. Ce plug-in vous permet de mettre en œuvre rapidement la recherche vectorielle pour des cas d'utilisation tels que la recherche d'images, l'empreinte digitale vidéo, la reconnaissance faciale, la reconnaissance vocale et la recommandation de produits. Cette rubrique décrit comment utiliser le plug-in aliyun-knn.
Ce guide s'adresse aux clients utilisant le plug-in knn sur les instances Elasticsearch héritées.
Pour les nouveaux cas d'utilisation de recherche vectorielle, nous vous recommandons d'acheter une instance Elasticsearch (version 8.15 ou ultérieure) et d'utiliser les capacités natives de recherche vectorielle du moteur.
Contexte
-
Cas d'utilisation
Le moteur de recherche vectorielle Alibaba Cloud Elasticsearch a fait ses preuves dans des applications de production à grande échelle, notamment Pailitao, Image Search, l'échantillonnage d'empreintes digitales vidéo pour Qutoutiao, les recommandations « Guess You Like », la recherche personnalisée et la recherche multimédia croisée.
-
Fonctionnement
La fonctionnalité de recherche vectorielle dans Alibaba Cloud Elasticsearch est un plug-in construit sur le mécanisme d'extension d'Elasticsearch. Le plug-in est entièrement compatible avec les versions natives d'Elasticsearch, ce qui garantit une courbe d'apprentissage douce. Les index vectoriels prennent en charge les écritures incrémentielles en temps réel et les requêtes quasi en temps réel (NRT). Ils offrent également toutes les capacités distribuées natives d'Elasticsearch, y compris la prise en charge de plusieurs réplicas et la récupération après erreur.
RemarqueLe plug-in de recherche vectorielle Alibaba Cloud Elasticsearch ne prend pas en charge la migration des données à l'aide d'un snapshot OSS ou de DataWorks. Nous vous recommandons d'utiliser Logstash.
-
Algorithmes
Le moteur de recherche vectorielle prend en charge les algorithmes HNSW (Hierarchical Navigable Small World) et linéaire. Ces algorithmes conviennent aux cas d'utilisation impliquant de petits ensembles de données en mémoire sur une seule machine. Le tableau suivant compare les performances de ces deux algorithmes.
Tableau 1. Comparaison des performances des algorithmes HNSW et linéaire
Les données de ce tableau ont été mesurées dans un environnement Alibaba Cloud Elasticsearch V6.7.0. L'environnement de test était configuré comme suit :
Configuration de l'instance : Deux nœuds de données, chacun doté de 16 cœurs, de 64 Go de mémoire et d'un disque cloud SSD de 100 Go.
Ensemble de données : Vecteurs flottants SIFT à 128 dimensions.
Total des données : 20 millions d'enregistrements.
Configuration de l'index : Paramètres par défaut.
Métrique de performance
HNSW
Linéaire
Rappel Top-10
98,6 %
100 %
Rappel Top-50
97,9 %
100 %
Rappel Top-100
97,4 %
100 %
Latence (p99)
0 093 s
0 934 s
Latence (p90)
0 018 s
0 305 s
RemarqueDans ce tableau, p représente le centile. Par exemple, la latence (p99) correspond au temps dans lequel 99 % des requêtes sont renvoyées.
Prérequis
-
La méthode d'installation du plug-in aliyun-knn varie selon la version de votre cluster Alibaba Cloud Elasticsearch et sa version de noyau. Pour plus de détails, consultez le tableau suivant.
Version d'Elasticsearch
Version du noyau
Description
6.7.0
Antérieure à 1.2.0
-
Vous devez installer manuellement le plug-in aliyun-knn sur la page Plug-ins. Pour plus d'informations, consultez la section Installer ou désinstaller les plug-ins par défaut.
-
Des fonctionnalités telles que la recherche basée sur des scripts et le préchauffage d'index ne sont pas prises en charge. Si vous avez besoin de ces fonctionnalités, utilisez un cluster disposant d'une version de noyau Alibaba Cloud Elasticsearch. Pour plus d'informations, consultez les Notes de version du noyau.
-
Lors de la création d'un index vectoriel, seule la métrique de distance
SquaredEuclideanpar défaut est prise en charge. Vous ne pouvez pas spécifier de métrique de distance à l'aide du paramètredistance_method.
6.8
S.O.
7.4
S.O.
7.7
S.O.
6.7.0
1.2.0 ou ultérieure
-
Le plug-in aliyun-knn est intégré au plug-in apack, qui est installé par défaut. Pour installer ou désinstaller le plug-in aliyun-knn, vous devez gérer le plug-in apack. Pour plus d'informations, consultez la section Utiliser la fonctionnalité de réplication physique du plug-in apack.
-
Pour utiliser des fonctionnalités avancées telles que la recherche basée sur des scripts, le préchauffage d'index et les fonctions étendues, vous devez mettre à niveau la version du noyau vers la version 1.3.0 ou ultérieure. Pour obtenir des instructions, consultez la section Mettre à niveau les versions.
-
Si une erreur d'analyse de mapping se produit lors de la création d'un index vectoriel, mettez à niveau la version du noyau vers la version 1.3.0 ou ultérieure et réessayez.
7.10.0
1.4.0 ou ultérieure
-
Le plug-in aliyun-knn est intégré au plug-in apack, qui est installé par défaut. Pour installer ou désinstaller le plug-in aliyun-knn, vous devez gérer le plug-in apack. Pour plus d'informations, consultez la section Utiliser la fonctionnalité de réplication physique du plug-in apack.
-
Si la version mineure du noyau est 1.4.0 ou ultérieure, le plug-in apack est la dernière version et ne nécessite aucune mise à jour. Pour vérifier la version du plug-in, exécutez la commande GET _cat/plugins?v.
Autres versions
S.O.
La recherche vectorielle n'est pas prise en charge.
RemarqueLa version du noyau est différente de la version du plug-in apack. Pour vérifier la version du plug-in apack, exécutez la commande GET _cat/plugins?v.
-
-
Planifiez votre index.
Algorithme
Cas d'utilisation
En mémoire
Autre
hnsw
-
Petits ensembles de données sur une seule machine.
-
Exigences de faible latence.
-
Exigences élevées en matière de rappel.
Oui
-
L'algorithme hnsw repose sur l'idée que « le voisin d'un voisin est probablement aussi un voisin ». La métrique de distance de cet algorithme doit satisfaire l'inégalité triangulaire (la somme de deux côtés d'un triangle est supérieure au troisième côté). Par exemple, les espaces de vecteurs de produit interne ne satisfont pas l'inégalité triangulaire et doivent être convertis en espaces euclidiens ou sphériques pour utiliser la méthode de recherche hnsw.
-
Après l'écriture des données, exécutez forceMerge périodiquement pendant les heures creuses pour réduire la latence des requêtes.
linear
-
Recherche par force brute.
-
Rappel de 100 %.
-
La latence augmente avec le volume de données.
-
À utiliser pour les comparaisons de référence.
Oui
Aucun.
-
-
Planifiez votre cluster.
Paramètre
Description
Spécification du nœud de données (obligatoire)
16 cœurs, 64 Go ou plus.
RemarqueLa construction d'un index avec le plug-in aliyun-knn consomme beaucoup de ressources. Les clusters de faible spécification peuvent devenir des goulots d'étranglement et affecter la stabilité. Utilisez un cluster avec des spécifications de 16 cœurs, 64 Go ou plus.
Type de nœud
Le cluster doit disposer de nœuds master dédiés.
Mémoire hors tas du cluster
Supérieure au double de la taille totale des données vectorielles dans le cluster.
Exemple : Un index contient un champ flottant à 960 dimensions et 400 documents. Comme un float occupe 4 octets, la mémoire utilisée pour les données vectorielles est calculée comme suit : 960 × 400 × 4 = 1,5 Mo. Par conséquent, la mémoire hors tas doit dépasser 3 Mo (1,5 Mo × 2).
Remarque-
Si vous effectuez une opération de fusion forcée (force merge), les anciennes et les nouvelles données sont chargées simultanément en mémoire. Dans ce cas, vous devez doubler la valeur calculée à l'aide de la formule précédente.
-
Pour les clusters disposant de 64 Go de mémoire ou plus, la taille de la mémoire hors tas est approximativement égale à la mémoire totale moins 32 Go (mémoire hors tas ≈ mémoire totale - 32 Go).
Débit d'écriture
La construction d'un index vectoriel est une tâche intensive en CPU. Pour un nœud de données de 16 cœurs et 64 Go, limitez le débit d'écriture maximal à 5 000 tps par nœud.
De plus, lors d'une requête vectorielle, tous les fichiers d'index sont chargés dans la mémoire système. Par conséquent, évitez les écritures volumineuses tout en servant des requêtes métier. Cela permet d'éviter les redémarrages de shards causés par la pression sur la mémoire.
RemarqueCes valeurs sont des estimations. Basez votre planification sur votre charge de travail réelle, effectuez des tests de charge à l'avance et provisionnez suffisamment de mémoire.
-
Limitations
Le plug-in aliyun-knn n'est pas pris en charge sur les instances version 6.7 avec la fonctionnalité de stockage élastique partagé activée.
Pour installer le plug-in aliyun-knn, les nœuds de données de votre instance Alibaba Cloud Elasticsearch doivent être de 16 cœurs, 64 Go ou plus. Si vos nœuds ne répondent pas à cette exigence, vous devez mettre à niveau leurs spécifications. Pour plus d'informations, consultez la section Mettre à niveau la configuration d'un cluster.
Le plug-in aliyun-knn est incompatible avec certaines fonctionnalités améliorées du noyau AliES, telles que la fonctionnalité de réplication physique. Si cette fonctionnalité est activée, vous devez la désactiver avant d'utiliser le plug-in. Pour obtenir des instructions, consultez la section Utiliser la fonctionnalité de réplication physique du plug-in apack.
Vous ne pouvez pas utiliser de snapshots OSS ou DataWorks pour la migration des données sur les instances utilisant le plug-in aliyun-knn. Nous vous recommandons d'utiliser Logstash à la place.
Créer un index vectoriel
-
Connectez-vous à la console Kibana de votre cluster Elasticsearch.
Pour obtenir des instructions, consultez la section Se connecter à la console Kibana.
RemarqueLes exemples ici utilisent Elasticsearch V6.7.0. Les opérations peuvent varier légèrement pour d'autres versions.
Dans le volet de navigation de gauche, choisissez .
-
Dans l'onglet Console, exécutez la commande suivante pour créer un index vectoriel.
PUT test { "settings": { "index.codec": "proxima", "index.vector.algorithm": "hnsw" }, "mappings": { "_doc": { "properties": { "feature": { "type": "proxima_vector", "dim": 2, "vector_type": "float", "distance_method": "SquaredEuclidean" } } } } }RemarqueVous pouvez ajouter d'autres types de champs pris en charge par Elasticsearch à l'index vectoriel.
Si une erreur d'analyse de mapping se produit lors de la création de l'index vectoriel :
"type": "mapper_parsing_exception", "reason": "Mapping definition for [feature] has unsupported parameters: [distance_method : SquaredEuclidean]", mettez à niveau le noyau vers la dernière version et réessayez.
Type
Paramètre
Valeur par défaut
Description
setting
index.codec
proxima
Indique s'il faut construire un index proxima kNN au niveau sous-jacent. Valeurs valides :
-
proxima (recommandé) : Un index proxima kNN est construit au niveau sous-jacent pour prendre en charge la recherche vectorielle.
-
null : Ne construit pas d'index proxima kNN. Il construit uniquement un index direct. Dans ce cas, les champs de type proxima_vector prennent en charge uniquement la recherche basée sur des scripts et ne prennent pas en charge la recherche hnsw ou linear.
RemarquePour les grands ensembles de données où la latence des requêtes n'est pas une préoccupation principale, vous pouvez supprimer ce paramètre ou le définir sur null. Cela vous permet d'effectuer des requêtes vectorielles kNN à l'aide de la recherche basée sur des scripts. La recherche basée sur des scripts est prise en charge si votre instance est V6.7.0 avec la version 1.2.1 ou ultérieure du plug-in apack, ou si votre instance est V7.10.0 avec la version 1.4.0 ou ultérieure du plug-in apack.
index.vector.algorithm
hnsw
L'algorithme de recherche vectorielle. Valeurs valides :
-
hnsw : L'algorithme HNSW.
-
linear : L'algorithme linéaire.
index.vector.general.builder.offline_mode
false
Indique s'il faut utiliser le mode d'optimisation hors ligne pour construire l'index kNN. Valeurs valides :
-
false : Désactive le mode d'optimisation hors ligne.
-
true : Active le mode d'optimisation hors ligne. Ce mode réduit la fragmentation des segments lors des écritures et améliore le débit d'écriture.
Remarque-
Pour activer le mode d'optimisation hors ligne, votre instance doit être V6.7.0 avec la version 1.2.1 ou ultérieure du plug-in apack, ou V7.10.0 avec la version 1.4.0 ou ultérieure du plug-in apack. Les index construits en mode d'optimisation hors ligne ne prennent pas en charge la recherche de données basée sur des scripts.
-
Nous vous recommandons d'activer le mode d'optimisation hors ligne pour les importations groupées ponctuelles d'un ensemble de données complet.
mapping
type
proxima_vector
Le type de champ vectoriel. Par exemple, définir le champ feature sur proxima_vector spécifie que feature est un champ vectoriel.
dim
2
La dimension du vecteur. Ce paramètre est obligatoire. La valeur doit être un entier compris entre 1 et 2048.
vector_type
float
Le type de données du vecteur. Valeurs valides :
-
float : Nombre à virgule flottante.
-
short : Entier court.
-
binary : Binaire.
Pour le type binary, les données vectorielles doivent être représentées sous forme de tableau d'entiers non signés 32 bits (uint32), et la valeur dim doit être un multiple de 32.
Par exemple, si vos données métier correspondent à la valeur binaire 64 bits 1000100100100101111000001001111101000011010010011010011010000100, le vecteur écrit est [-1994006369, 1128900228].
RemarqueLes trois types de données vectorielles sont pris en charge sur les instances V6.7.0 avec la version 1.2.1 ou ultérieure du plug-in apack, ou V7.10.0 avec la version 1.4.0 ou ultérieure du plug-in apack. Les versions antérieures ne prennent en charge que le type float.
distance_method
SquaredEuclidean
La fonction de distance. Valeurs valides :
-
SquaredEuclidean : Distance euclidienne (sans racine carrée).
-
InnerProduct : Produit scalaire.
-
Cosine : Similarité cosinus.
-
Hamming : Distance de Hamming (pour le type binaire uniquement).
Remarque-
Les quatre fonctions de distance sont prises en charge sur les instances V6.7.0 avec la version 1.2.1 ou ultérieure du plug-in apack, ou V7.10.0 avec la version 1.4.0 ou ultérieure du plug-in apack. Les versions antérieures ne prennent en charge que la fonction SquaredEuclidean par défaut. Vous ne pouvez pas spécifier d'autres fonctions de distance à l'aide du paramètre
distance_method. -
Pour plus d'informations sur les fonctions de distance, consultez la section Fonctions de distance.
-
Étant donné que la fonction
Hammingpossède une implémentation spéciale, les requêtesknnstandard ne sont pas prises en charge lorsque vous utilisez des indexhnswoulinear. Seules les requêtes basées sur des scripts compatibles avec script_score sont prises en charge. Vous devez tester les instructions de requête dans différents scénarios pour vous assurer qu'elles sont adaptées à vos exigences métier spécifiques.
RemarqueVous pouvez exécuter la commande GET /_cat/plugins?v pour vérifier la version du plug-in apack. Si la version ne répond pas aux exigences, vous pouvez soumettre un ticket pour demander une mise à niveau.
La recherche vectorielle kNN fournit également des paramètres de requête avancés. Pour plus d'informations, consultez la section Paramètres avancés.
-
Exécutez la commande suivante pour ajouter un document.
POST test/_doc { "feature": [1.0, 2.0] }RemarquePour tous les types de tableaux sauf le type binaire, la longueur du tableau doit correspondre à dim. Pour le type binaire, les données vectorielles doivent être converties en un tableau d'entiers non signés 32 bits (uint32), et dim doit être un multiple entier de 32.
Recherche vectorielle
-
Recherche standard
Exécutez la commande suivante pour effectuer une recherche standard.
GET test/_search { "query": { "hnsw": { "feature": { "vector": [1.5, 2.5], "size": 10 } } } }Le tableau suivant décrit les paramètres courants.
Paramètre
Description
hnsw
L'algorithme de recherche vectorielle. Il doit correspondre à l'algorithm spécifié lors de la création de l'index.
vector
Le vecteur de requête. La longueur du tableau doit être identique à la valeur dim spécifiée dans le mapping lors de la création de l'index.
size
Spécifie le nombre de documents à renvoyer.
Remarque-
Le paramètre size d'une recherche vectorielle diffère du paramètre size intégré à Elasticsearch. Le premier contrôle le nombre de documents renvoyés par le plug-in kNN, tandis que le second contrôle le nombre total de documents renvoyés par l'ensemble de la requête. Lors de l'exécution d'une requête, le système utilise d'abord le paramètre size de la recherche vectorielle pour récupérer le nombre spécifié de meilleurs documents. Ensuite, il applique le paramètre size intégré à Elasticsearch aux résultats avant de renvoyer l'ensemble final de documents.
-
Nous vous recommandons de définir le paramètre size de la recherche vectorielle sur la même valeur que le paramètre size intégré à Elasticsearch, dont la valeur par défaut est 10.
RemarqueLa recherche vectorielle kNN propose également des paramètres de requête avancés. Pour plus d'informations, consultez la section Paramètres avancés.
-
-
Requête de script
Les requêtes de script vectorielles ne peuvent être utilisées qu'avec script_score. Par exemple, vous pouvez utiliser script_score pour attribuer un score à chaque document renvoyé selon la formule
1/(1+l2Squared(params.queryVector, doc['feature'])). La commande suivante illustre un exemple.GET test/_search { "query": { "match_all": {} }, "rescore": { "query": { "rescore_query": { "function_score": { "functions": [{ "script_score": { "script": { "source": "1/(1+l2Squared(params.queryVector, doc['feature'])) ", "params": { "queryVector": [2.0, 2.0] } } } }] } } } } }La requête de script vectorielle kNN ne prend pas en charge les fonctions fournies par X-Pack. Seules les fonctions suivantes sont prises en charge :
Fonction
Description
l2Squared(float[] queryVector, DocValues docValues)Fonction de distance euclidienne.
hamming(float[] queryVector, DocValues docValues)Fonction de distance de Hamming.
-
cosineSimilarity(float[] queryVector, DocValues docValues) -
cosine(float[] queryVector, DocValues docValues)
Fonction de similarité cosinus.
RemarquePour Alibaba Cloud Elasticsearch V6.7, utilisez la fonction
cosineSimilarity(float[] queryVector, DocValues docValues). Pour la version V7.10, utilisez la fonctioncosine(float[] queryVector, DocValues docValues).RemarquePour utiliser la fonctionnalité de requête de script, votre configuration doit répondre à l'une des exigences suivantes : version de cluster 6.7.0 avec le plug-in apack V1.2.1 ou ultérieur, ou version de cluster 7.10.0 avec le plug-in apack V1.4.0 ou ultérieur. Vous pouvez exécuter la commande GET /_cat/plugins?v pour vérifier la version du plug-in apack. Si la version ne répond pas aux exigences, vous pouvez soumettre un ticket pour demander une mise à niveau.
-
Paramètres de fonction :
float[] queryVector : le vecteur de requête.
DocValues docValues : le vecteur de document.
Les requêtes de script vectorielles ne sont pas prises en charge pour les index construits avec le mode d'optimisation hors ligne (
index.vector.builder.offlineMode = true).
-
-
Préchauffage d'index
Un index kNN effectue une recherche complète en mémoire, ce qui peut entraîner une latence de requête élevée lors d'un démarrage à froid lorsque l'index est chargé pour la première fois. La fonctionnalité de préchauffage d'index du plug-in kNN évite ce problème en préchargeant un index dans la mémoire locale avant qu'il ne traite les requêtes de recherche, réduisant ainsi considérablement la latence de démarrage à froid.
-
Préchauffez tous les index vectoriels.
POST _vector/warmup -
Préchauffez un index vectoriel spécifique.
POST _vector/{indexName}/warmup
RemarquePour utiliser la fonctionnalité de préchauffage d'index, votre configuration doit répondre à l'une des exigences suivantes : version de cluster 6.7.0 avec le plug-in apack V1.2.1 ou ultérieur, ou version de cluster 7.10.0 avec le plug-in apack V1.4.0 ou ultérieur. Vous pouvez exécuter la commande GET _cat/plugins?v pour vérifier la version du plug-in apack. Si la version ne répond pas aux exigences, vous pouvez soumettre un ticket pour demander une mise à niveau.
Si votre cluster contient de nombreux index vectoriels volumineux mais que votre application n'effectue des recherches vectorielles que sur un sous-ensemble d'entre eux, préchauffez uniquement ces index spécifiques afin d'améliorer les performances de recherche en mémoire.
-
Notation vectorielle
La recherche vectorielle utilise une formule de notation unifiée basée sur une fonction de métrique de distance, qui affecte directement le classement des résultats de recherche.
Formule de notation :
score = 1 / (fonction de distance vectorielle + 1)
Par défaut, le mécanisme de notation vectorielle utilise la distance euclidienne au carré.
En pratique, vous pouvez optimiser vos données vectorielles et améliorer la notation en déterminant la distance entre les vecteurs à partir du score de requête.
Fonctions de mesure de distance
Différentes fonctions de mesure de distance utilisent différents mécanismes de notation. Le tableau suivant détaille les fonctions de mesure de distance prises en charge par le plug-in aliyun-knn.
|
Fonction de distance |
Description |
Formule de notation |
Idéal pour |
Exemple |
|
SquaredEuclidean (distance euclidienne au carré) |
La distance euclidienne est la distance en ligne droite entre deux points dans un espace multidimensionnel. Dans l'espace 2D et 3D, elle correspond à la distance physique. |
Pour deux vecteurs à n dimensions, A = [A1, A2, ..., An] et B = [B1, B2, ..., Bn] :
Remarque
Par défaut, la notation vectorielle utilise la distance euclidienne au carré. |
La distance euclidienne reflète la différence absolue des valeurs des composantes vectorielles. Elle est idéale pour les analyses où l'ampleur des différences est significative, comme l'analyse de la similarité ou de la variance de la valeur utilisateur basée sur des métriques de comportement. |
Pour les vecteurs 2D [0,0] et [1,2], la distance euclidienne au carré est (1-0)² + (2-0)² = 5. |
|
Cosine (similarité cosinus) |
La similarité cosinus évalue la similarité entre deux vecteurs en calculant le cosinus de l'angle qui les sépare. |
Pour deux vecteurs à n dimensions, A = [A1, A2, ..., An] et B = [B1, B2, ..., Bn] :
|
La similarité cosinus se concentre sur l'orientation des vecteurs plutôt que sur leur magnitude, ce qui la rend insensible aux valeurs absolues. Elle est idéale pour comparer les intérêts des utilisateurs en fonction des notes de contenu, car elle peut corriger les incohérences des échelles de notation entre différents utilisateurs. |
Pour les vecteurs 2D [1,1] et [1,0], la similarité cosinus est de 0 707. |
|
InnerProduct (produit scalaire) |
Le produit scalaire, également appelé produit intérieur, est une opération qui combine deux vecteurs réels pour produire une seule valeur scalaire. |
Pour deux vecteurs à n dimensions, A = [A1, A2, ..., An] et B = [B1, B2, ..., Bn] :
|
Le produit scalaire prend en compte à la fois l'angle et la magnitude de deux vecteurs. Lorsque les vecteurs sont normalisés, le produit scalaire équivaut à la similarité cosinus. |
Pour les vecteurs 2D [1,1] et [1,5], le produit scalaire est (11) + (15) = 6. |
|
Hamming (pour les vecteurs binaires uniquement) |
En théorie de l'information, la distance de Hamming entre deux chaînes de caractères de même longueur est le nombre de positions auxquelles les caractères correspondants diffèrent. |
Pour deux chaînes binaires de n bits, x et y :
|
Elle est généralement utilisée pour la détection et la correction d'erreurs dans les transmissions de données, où elle compte le nombre de bits différents entre deux mots binaires pour estimer l'erreur de transmission. |
Par exemple, la distance de Hamming entre 1011101 et 1001001 est de 2. Remarque
Lors de l'utilisation du plug-in aliyun-knn, les données de vecteur binaire doivent être représentées sous forme de tableau d'entiers non signés 32 bits (uint32), et la valeur du paramètre |
Pour utiliser plusieurs fonctions de mesure de distance, assurez-vous que votre cluster répond à l'une des exigences suivantes : version de cluster 6.7.0 avec le plug-in apack V1.2.1 ou ultérieur, ou version de cluster 7.10.0 avec le plug-in apack V1.4.0 ou ultérieur. Vous pouvez exécuter la commande GET _cat/plugins?v pour vérifier la version de votre plug-in apack. Si la version ne répond pas aux exigences, la seule fonction de mesure de distance kNN prise en charge est SquaredEuclidean. Si vous devez utiliser d'autres fonctions de distance, vous pouvez soumettre un ticket pour demander une mise à niveau du plug-in.
Vous pouvez spécifier la fonction de mesure de distance à l'aide du paramètre distance_method dans le mapping de l'index.
Paramètres du disjoncteur
|
Paramètre |
Description |
Valeur par défaut |
|
indices.breaker.vector.native.indexing.limit |
Si l'utilisation de la mémoire hors tas dépasse ce seuil, le disjoncteur se déclenche et bloque les opérations d'écriture. Les écritures reprennent une fois le processus de construction en arrière-plan terminé et la mémoire libérée. Un disjoncteur déclenché indique que la consommation de mémoire du système est trop élevée. Nous vous recommandons de réduire le débit d'écriture. |
70 % |
|
indices.breaker.vector.native.total.limit |
Définit le pourcentage maximal de mémoire hors tas que les constructions d'index vectoriel en arrière-plan peuvent utiliser. Si l'utilisation de la mémoire hors tas dépasse cette limite, les shards peuvent redémarrer. |
80 % |
Les paramètres du disjoncteur vectoriel font partie de la configuration du cluster. Pour afficher les paramètres, exécutez la commande GET _cluster/settings. Ne modifiez pas les seuils du disjoncteur.
Paramètres avancés
Tableau 2. Paramètres de création (hnsw)
|
Paramètre |
Description |
Valeur par défaut |
|
index.vector.hnsw.builder.max_scan_num |
Contrôle l'étendue de la recherche des plus proches voisins lors de la construction du graphe afin de garantir les performances dans le pire des cas. |
100000 |
|
index.vector.hnsw.builder.neighbor_cnt |
Le nombre de voisins pour chaque nœud dans le graphe de la couche 0. Nous vous recommandons une valeur de 100. Une valeur plus élevée améliore la qualité de la construction du graphe, mais augmente la taille de l'index hors ligne. |
100 |
|
index.vector.hnsw.builder.upper_neighbor_cnt |
Le nombre maximal de voisins pour chaque nœud dans les couches supérieures du graphe HNSW (toutes les couches sauf la couche 0). Nous vous recommandons de définir cette valeur sur la moitié de la valeur de neighbor_cnt. La valeur maximale est 255. |
50 |
|
index.vector.hnsw.builder.efconstruction |
Contrôle la taille de la liste dynamique de candidats pour les plus proches voisins lors de la construction du graphe. Une valeur plus élevée améliore la qualité du graphe hors ligne, mais ralentit la création de l'index. Nous vous recommandons une valeur initiale de 400. |
400 |
|
index.vector.hnsw.builder.max_level |
Le nombre total de couches dans le graphe HNSW, y compris la couche 0 et les couches supérieures. Par exemple, pour 10 millions de documents avec un scaling_factor de 30, le nombre de couches est ceil(log₃₀(10 000 000)), soit 5. Ce paramètre a un impact mineur sur l'efficacité. Nous vous recommandons une valeur initiale de 6. |
6 |
|
index.vector.hnsw.builder.scaling_factor |
Le facteur d'échelle exponentiel entre les couches. Cette valeur est généralement comprise entre 10 et 100. Un scaling_factor plus élevé entraîne moins de couches. Nous vous recommandons une valeur initiale de 50. |
50 |
Les paramètres précédents doivent être configurés dans les settings de l'index et ne sont pris en charge que par l'algorithme hnsw.
Tableau 3. Paramètres de recherche (hnsw)
|
Paramètre |
Description |
Valeur par défaut |
|
ef |
Contrôle la taille de la liste dynamique de candidats à explorer lors de la recherche en ligne. Une valeur plus élevée améliore le rappel, mais dégrade les performances. Nous vous recommandons une valeur comprise entre 100 et 1000. |
100 |
Exemple de requête :
GET test/_search
{
"query": {
"hnsw": {
"feature": {
"vector": [1.5, 2.5],
"size": 10,
"ef": 100
}
}
}
}
FAQ
-
Q : Comment évaluer le taux de rappel d'une requête ?
R : Créez deux index avec des configurations identiques, l'un utilisant l'algorithme HNSW et l'autre l'algorithme de recherche linéaire. À partir d'un client, poussez les mêmes données vectorielles vers les deux index. Après l'actualisation des index, utilisez le même vecteur de requête pour récupérer les ID de document des deux index. Le taux de rappel correspond au nombre d'ID de document communs aux deux index divisé par le nombre total d'ID de l'index de recherche linéaire.
-
Q : Que faire si une erreur
circuitBreakingExceptionse produit lors des écritures dans le cluster ?R : Cette erreur indique que l'utilisation de la mémoire hors tas a dépassé le seuil spécifié par indices.breaker.vector.native.indexing.limit (70 % par défaut), ce qui déclenche le disjoncteur sur les opérations d'écriture. Le disjoncteur se réinitialise généralement automatiquement une fois la construction de l'index en arrière-plan terminée et la mémoire libérée. Nous vous recommandons d'ajouter un mécanisme de nouvelle tentative à votre client.
-
Q : Pourquoi l'utilisation du processeur reste-t-elle élevée après l'arrêt des opérations d'écriture ?
R : La construction de l'index vectoriel se produit pendant les phases d'actualisation ou de vidage. Même après l'arrêt du trafic d'écriture, les tâches en arrière-plan pour la construction de l'index vectoriel peuvent continuer à s'exécuter. Ces tâches libèrent les ressources de calcul une fois le dernier cycle d'actualisation terminé.
-
Q : Lors de l'interrogation avec le plug-in aliyun-knn, je reçois l'erreur suivante :
class_cast_exception: class org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader cannot be cast to class org.apache.lucene.index.SegmentReader (org.apache.lucene.index.SoftDeletesDirectoryReaderWrapper$SoftDeletesFilterCodecReader and org.apache.lucene.index.SegmentReader are in unnamed module of loader 'app'). Que dois-je faire ?R : Désactivez la fonctionnalité de réplication physique pour l'index. Pour plus d'informations, consultez la section Utiliser la fonctionnalité de réplication physique du plug-in apack.
-
Q : Que puis-je faire si la recherche vectorielle avec le plug-in aliyun-knn est lente ou si un disjoncteur lié à la mémoire se déclenche ?
R : Le plug-in aliyun-knn effectue la recherche vectorielle à l'aide de vecteurs en mémoire, ce qui est un processus gourmand en mémoire. Les index volumineux peuvent entraîner des performances lentes ou déclencher un disjoncteur lorsqu'ils sont chargés en mémoire. En tant que bonne pratique, limitez la taille des données de votre index à la moitié de la mémoire disponible de la machine. Si vous ne pouvez pas réduire le volume de données et que la mémoire reste insuffisante, mettez à niveau la configuration du cluster.
-
Q : Dans les scénarios kNN, une requête
must_not existsne parvient pas à filtrer les documents dont le champ « feature » est vide. Comment écrire une requête pour filtrer ces données ?R : Le mécanisme de stockage des données kNN est unique et peut être incompatible avec certaines requêtes DSL. Vous pouvez utiliser le script suivant pour filtrer les données à la place.
GET jx-similar-product-v1/_search { "query": { "bool": { "must": { "script": { "script": { "source": "doc['feature'].empty", "lang": "painless" } } } } } }
