Tous les produits
Search
Centre de documentation

Elasticsearch:Plug-in de recherche vectorielle aliyun-knn

Dernière mise à jour :Aug 25, 2026

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.

Remarque
  • 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.

    Remarque

    Le 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

    Remarque

    Dans 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 SquaredEuclidean par défaut est prise en charge. Vous ne pouvez pas spécifier de métrique de distance à l'aide du paramètre distance_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.

    Remarque

    La 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.

    Remarque

    La 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.

    Remarque

    Ces 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

  1. Connectez-vous à la console Kibana de votre cluster Elasticsearch.

    Pour obtenir des instructions, consultez la section Se connecter à la console Kibana.

    Remarque

    Les exemples ici utilisent Elasticsearch V6.7.0. Les opérations peuvent varier légèrement pour d'autres versions.

  2. Dans le volet de navigation de gauche, choisissez Management > Dev Tools.

  3. 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" 
            }
          }
        }
      }
    }
    Remarque
    • Vous 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.

    Remarque

    Pour 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].

    Remarque

    Les 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 Hamming possède une implémentation spéciale, les requêtes knn standard ne sont pas prises en charge lorsque vous utilisez des index hnsw ou linear. 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.

    Remarque
    • 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.

    • 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.

  4. Exécutez la commande suivante pour ajouter un document.

    POST test/_doc
    {
      "feature": [1.0, 2.0]
    }
    Remarque

    Pour 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.

    Remarque

    La 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.

    Remarque

    Pour Alibaba Cloud Elasticsearch V6.7, utilisez la fonction cosineSimilarity(float[] queryVector, DocValues docValues). Pour la version V7.10, utilisez la fonction cosine(float[] queryVector, DocValues docValues).

    Remarque
    • Pour 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
    Remarque
    • Pour 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)

Remarque
  • 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] :

  • Distance euclidienne au carré = (A1-B1)² + (A2-B2)² + ... + (An-Bn)²

  • Score = 1 / (distance + 1)

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] :

  • Formule : Distance cosinus Cosine

  • Score = 1 / (distance + 1), où la distance est définie comme (1 - similarité cosinus).

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] :

  • Produit scalaire = A1B1 + A2B2 + ... + An*Bn

  • Score = produit scalaire

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 :

  • d(x,y) = Σ(x[i] ⊕ y[i]) pour i=0, 1, ..., n-1, où ⊕ désigne l'opération XOR.

  • Score = 1 / (distance + 1)

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 dim doit être un multiple de 32.

Remarque
  • 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 %

Important

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

Remarque

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 circuitBreakingException se 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 exists ne 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"
                 }
             }
           }
         }
       }
    }