<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Ugo Sangiorgi - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Ugo Sangiorgi - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/fr/search-labs/author/ugo-sangiorgi</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/author/ugo-sangiorgi</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/author/ugo-sangiorgi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Mon, 21 Sep 2026 02:52:13 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch BBQ vs. OpenSearch FAISS : Comparaison des performances de la recherche vectorielle]]></title>
    <description><![CDATA[Comparaison des performances entre Elasticsearch BBQ et OpenSearch FAISS.]]></description>
    <content:encoded><![CDATA[<p><strong>Recherche vectorielle avec quantification binaire : Elasticsearch avec BBQ est 5 fois plus rapide qu'OpenSearch avec FAISS</strong>. Elastic a reçu des demandes de notre communauté pour clarifier les différences de performance entre Elasticsearch et OpenSearch, en particulier dans le domaine de la recherche sémantique/recherche vectorielle. Nous avons donc réalisé ces tests de performance pour fournir des comparaisons claires et basées sur des données.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8792b5284e7a553/6a1709b9961e69a084c4cee6/7f4f8d08f7bee188423e4e65f0caefc7e34f0355-1600x681.png" alt="Elasticsearch BBQ vs OpenSearch FAISS - Vitesse &amp; débit Comparaison du rappel" /><h2>Démonstration de quantification binaire</h2><p>Le stockage de vecteurs à haute dimension dans leur forme originale peut nécessiter beaucoup de mémoire. Les techniques de quantification compriment ces vecteurs dans une représentation compacte, ce qui réduit considérablement l'empreinte mémoire. La recherche s'effectue alors dans l'espace compressé, ce qui réduit la complexité des calculs et accélère les recherches, en particulier dans les grands ensembles de données.</p><p>Elastic s'engage à faire de Lucene un moteur vectoriel très performant. Nous avons introduit une <a href="https://www.elastic.co/fr/search-labs/blog/better-binary-quantization-lucene-elasticsearch">meilleure quantification binaire</a> (BBQ) dans Elasticsearch 8.16, en plus de Lucene, et l'avons fait évoluer dans les versions 8.18 et 9.0. BBQ repose sur une nouvelle approche de la <a href="https://www.elastic.co/fr/search-labs/blog/optimized-scalar-quantization-elasticsearch">quantification scalaire</a> qui réduit les dimensions float32 en bits, ce qui permet une réduction de la mémoire de ~95% tout en conservant une qualité de classement élevée.</p><p>OpenSearch, quant à lui, utilise plusieurs moteurs vectoriels : nmslib (aujourd'hui obsolète), Lucene et FAISS. Dans un <a href="https://www.elastic.co/fr/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison">blog précédent</a>, nous avons comparé Elasticsearch et OpenSearch pour la recherche vectorielle. Nous avons utilisé trois ensembles de données différents et testé différentes combinaisons de moteurs et de configurations sur les deux produits.</p><p>Ce blog se concentre sur les algorithmes de quantification binaire actuellement disponibles dans les deux produits. Nous avons testé Elasticsearch avec BBQ et OpenSearch avec la <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">quantification binaire de FAISS</a> en utilisant la piste Rallye <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a>.</p><p>L'objectif principal était d'évaluer la performance des deux solutions avec le même niveau de rappel. Que signifie le terme <em>"rappel"</em>? Le rappel est un indicateur qui mesure le nombre de résultats pertinents retrouvés par un système de recherche.</p><p>Dans cette évaluation, recall@k est particulièrement important, <em>k</em> représentant le nombre de premiers résultats pris en compte. Le <strong>rappel@10</strong>, le <strong>rappel@50 et le rappel@100</strong> mesurent donc le nombre de vrais résultats pertinents qui apparaissent respectivement dans les 10, 50 et 100 premiers éléments retrouvés. Le rappel est exprimé sur une échelle de 0 à 1 (ou de 0% à 100% précision). C'est important car nous parlons de KNN approximatif (ANN) et non de KNN exact, où le rappel est toujours de 1 (100%).</p><p>Pour chaque valeur de <em>k</em>, nous avons également spécifié <em>n, </em>qui est le nombre de candidats pris en compte avant d'appliquer le classement final. Cela signifie que pour Rappel@10, Rappel@50 et Rappel@100, le système récupère d'abord <em>n</em> candidats à l'aide de l'algorithme de quantification binaire, puis les classe pour déterminer si les <em>k</em> premiers résultats contiennent les éléments pertinents attendus.</p><p>En contrôlant <em>n</em>, nous pouvons analyser le compromis entre l'efficacité et la précision. Un <em>n</em> plus élevé <strong>augmente</strong> généralement le rappel, car plus de candidats sont disponibles pour le classement, mais il augmente également <strong>la</strong> latence et<strong> diminue le </strong>débit. Inversement, un <em>n</em> plus faible accélère la recherche mais peut réduire la mémorisation si trop peu de candidats pertinents sont inclus dans l'ensemble initial.</p><p>Dans cette comparaison, Elasticsearch a démontré une latence plus faible et un débit plus élevé qu'OpenSearch sur des configurations identiques.</p><h2>Méthodologie</h2><p>La configuration complète, ainsi que les scripts Terraform, les manifestes Kubernetes et la piste Rallye spécifique sont disponibles dans ce <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq">dépôt</a> sous <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq/rally-custom/custom_tracks/elasticsearch/openai_vector_bq"><em>openai_vector_bq</em></a>.</p><p>Comme pour les benchmarks précédents, nous avons utilisé un cluster Kubernetes composé de :</p><ul><li><p>1 pool de nœuds pour Elasticsearch 9.0 avec 3 machines <code>e2-standard-32</code> (128GB RAM et 32 CPUs)</p></li><li><p>1 pool de nœuds pour OpenSearch 2.19 avec 3 machines <code>e2-standard-32</code> (128GB RAM et 32 CPUs)</p></li><li><p>1 pool de nœuds pour Rallye avec 2 machines <code>e2-standard-4</code> (16GB RAM et 4 CPUs)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt934e988e96a5849f/6a1709bbacf08838f9be9ac1/169bb6033f6eebfd1b177b3446bf916fde4ee5c5-1600x856.png" alt="Configuration de la méthodologie Elasticsearch BBQ vs Opensearch FAISS" /><p>Nous avons mis en place un cluster Elasticsearch version 9.0 et un cluster OpenSearch version 2.19.</p><p>Elasticsearch et OpenSearch ont été testés avec la même configuration : nous avons utilisé <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> Rally track avec <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/commit/b97d5d95c22c8cf862f2030964524bdd156a5da3">quelques modifications</a> - qui utilise 2,5 millions de documents de l'<a href="https://huggingface.co/datasets/BeIR/nq">ensemble de données NQ</a> enrichis avec des embeddings générés à l'aide du <a href="https://openai.com/blog/new-and-improved-embedding-model">modèle text-embedding-ada-002</a> d'OpenAI.</p>{
  "source-file": "open_ai_corpus-initial-indexing.json.bz2",
  "document-count": 2580961,
  "compressed-bytes": 32076749416,
  "uncompressed-bytes": 90263571686
}<p>Les résultats portent sur la latence et le débit mesurés à différents niveaux de rappel (rappel@10, rappel@50 et rappel@100) en utilisant 8 clients simultanés pour effectuer des opérations de recherche. Nous avons utilisé un seul arbre et aucune réplique.</p><p>Nous avons exécuté les combinaisons suivantes de k-n-rescore, par exemple 10-2000-2000, ou <em>k:10</em>, <em>n:2000</em> et <em>rescore:2000</em> permet de retrouver les k (10) premiers candidats sur n candidats (2000) en appliquant un rescore sur 2000 résultats (ce qui équivaut à un "facteur de suréchantillon" de 1). Chaque recherche a été exécutée 10 000 fois avec 1000 recherches comme échauffement :</p><p></p><p><u><strong>Rappel@10</strong></u></p><ul><li><p>10-40-40</p></li><li><p>10-50-50</p></li><li><p>10-100-100</p></li><li><p>10-200-200</p></li><li><p>10-500-500</p></li><li><p>10-750-750</p></li><li><p>10-1000-1000</p></li><li><p>10-1500-1500</p></li><li><p>10-2000-2000</p></li></ul><p><u><strong>Rappel@50</strong></u></p><ul><li><p>50-150-150</p></li><li><p>50-200-200</p></li><li><p>50-250-250</p></li><li><p>50-500-500</p></li><li><p>50-750-750</p></li><li><p>50-1000-1000</p></li><li><p>50-1200-1200</p></li><li><p>50-1500-1500</p></li><li><p>50-2000-2000</p></li></ul><p><u><strong>Rappel@100</strong></u></p><ul><li><p>100-200-200</p></li><li><p>100-250-250</p></li><li><p>100-300-300</p></li><li><p>100-500-500</p></li><li><p>100-750-750</p></li><li><p>100-1000-1000</p></li><li><p>100-1200-1200</p></li><li><p>100-1500-1500</p></li><li><p>100-2000-2000</p></li></ul><p>Pour reproduire le benchmark, les manifestes Kubernetes pour rally-elasticsearch et rally-opensearch ont toutes les variables pertinentes externalisées dans un ConfigMap, disponible <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-es-bq.yml">ici</a> (ES) et <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-os-bq.yml">ici</a> (OS). Le paramètre <em>search_ops</em> peut être personnalisé pour tester n'importe quelle combinaison de k, n et rescore.</p><h3>Configuration d'OpenSearch Rally</h3><p><code>/k8s/rally-openai_vector-os-bq.yml</code></p>apiVersion: v1
kind: ConfigMap
metadata:
  name: rally-params-os
  labels:
    app: rally-opensearch
data:
  user-tags.json: |
    {
      "product": "OpenSearch",
      "product-version": "OpenSearch-2.19.0",
      "product-label": "OpenSearch-2.19-faiss",
      "benchmark-run": "19-feb-recall@100"
    }
  track-params.json: |
    {
      "mapping_type": "vectors-only-mapping-with-docid",
      "standalone_search_clients": 8,
      "standalone_search_iterations": 5000,
      "ann_threshold": 0,
      "vector_mode": "on_disk",
      "compression_level": "32x",
      "vector_method_name": "hnsw",
      "vector_method_engine": "faiss",
      "search_ops": [
        [100, 200, 200],
        [100, 250, 250],
        [100, 300, 300],
        [100, 500, 500],
        [100, 750, 750],
        [100, 1000, 1000],
        [100, 1200, 1200],
        [100, 1500, 1500],
        [100, 2000, 2000]
      ]
    }<h3>Configuration de l'index Opensearch</h3><p>Les variables du ConfigMap sont ensuite utilisées pour la configuration de l'index, certains paramètres restant inchangés. La quantification sur 1 bit dans OpenSearch est configurée en <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">réglant le niveau de compression sur "32x".</a></p><p><code>index-vectors-only-mapping-with-docid-mapping.json</code></p>{
  "settings": {
    {% if preload_pagecache %}
    "index.store.preload": [
      "vec", "vex", "vem", "veq", "veqm", "veb", "vebm"
    ],
    {% endif %}
    "index.number_of_shards": {{ number_of_shards | default(1) }},
    "index.number_of_replicas": {{ number_of_replicas | default(0) }},
    "index.knn": true,
    "index.knn.advanced.approximate_threshold": {{ ann_threshold | default(15000) }}
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "docid": {
        "type": "keyword"
      },
      "emb": {
        "type": "knn_vector",
        "dimension": 1536,
        "space_type": "innerproduct",
        "data_type": "float",
        "mode": {{ vector_mode | default("in_memory") | tojson }},
        "compression_level": {{ compression_level | default("32x") | tojson }},
        "method": {
          "name": {{ vector_method_name | default("hnsw") | tojson }},
          "engine": {{ vector_method_engine | default("faiss") | tojson }},
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}<h3>Configuration d'Elasticsearch Rally</h3><p><code>/k8s/rally-openai_vector-es-bq.yml</code></p>apiVersion: v1
kind: ConfigMap
metadata:
  name: rally-params-es
  labels:
    app: rally-elasticsearch
data:
  user-tags.json: |
    {
      "product": "Elasticsearch",
      "product-version": "Elasticsearch-9.0.0-ade01164",
      "product-label": "Elasticsearch-9.0-BBQ",
      "benchmark-run": "19-feb-recall@100"
    }
  track-params.json: |
    {
      "mapping_type": "vectors-only-mapping-with-docid",
      "standalone_search_clients": 8,
      "standalone_search_iterations": 5000,
      "vector_index_type": "bbq_hnsw",
      "search_ops": [
        [100, 200, 200],
        [100, 250, 250],
        [100, 300, 300],
        [100, 500, 500],
        [100, 750, 750],
        [100, 1000, 1000],
        [100, 1200, 1200],
        [100, 1500, 1500],
        [100, 2000, 2000]
      ]
    }<h3>Configuration de l'index Elasticsearch</h3><p><code>index-vectors-only-mapping-with-docid-mapping.json</code></p>{
  "settings": {
    {# non-serverless-index-settings-marker-start #}
    {%- if build_flavor != "serverless" or serverless_operator == true -%}
    {% if preload_pagecache %}
    "index.store.preload": [ "vec", "vex", "vem", "veq", "veqm", "veb", "vebm" ],
    {% endif %}
    "index.number_of_shards": {{ number_of_shards | default(1) }},
    "index.number_of_replicas": {{ number_of_replicas | default(0) }}
    {%- endif -%}
    {# non-serverless-index-settings-marker-end #}
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "docid": {
        "type": "keyword"
      },
      "emb": {
        "type": "dense_vector",
        "element_type": "float",
        "dims": 1536,
        "index": true,
        "similarity": "dot_product",
        "index_options": {
          "type": {{ vector_index_type | default("bbq_hnsw") | tojson }},
          "ef_construction": 100,
          "m": 16
        }
      }
    }
  }
}<h2>Résultats</h2><p>Il y a plusieurs façons d'interpréter les résultats. Pour la latence et le débit, nous avons tracé un graphique simplifié et un graphique détaillé à chaque niveau de rappel. Il est facile de voir les différences si l'on considère que "plus c'est élevé, mieux c'est" pour chaque indicateur. Cependant, le temps de latence est un facteur négatif (plus il est faible, mieux c'est), tandis que le débit est un facteur positif. Pour les graphiques simplifiés, nous avons utilisé <strong>(rappel / latence) * 10000 </strong>(appelé simplement "vitesse") et<strong> rappel * débit</strong>, de sorte que les deux mesures signifient qu'une plus grande vitesse et un plus grand débit sont meilleurs. Allons-y.</p><h3>Rappel @ 10 - simplifié</h3><p>À ce niveau de rappel, Elasticsearch BBQ est jusqu'à <strong>5 fois plus rapide </strong>(3,9 fois plus rapide en moyenne) et a un <strong>débit 3,2 fois plus élevé</strong> en moyenne qu'OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3de6b3460127a8ae/6a1709bcb339d55975769f6f/d580ad53e8974bd3aa75957c413a0136c4e465c5-1600x681.png" alt="Elasticsearch BBQ est jusqu'à 5 fois plus rapide (3,9 fois plus rapide en moyenne) et a un débit 3,2 fois plus élevé en moyenne qu'OpenSearch FAISS pour la vitesse et le débit Rappel@10" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd47045013cac5e9d/6a1709be0e2e49599a41a088/18edce667fe36ab95033264ef8df6f352dda2425-2044x866.png" alt="Elasticsearch BBQ est jusqu'à 5 fois plus rapide (3,9 fois plus rapide en moyenne) et a un débit 3,2 fois plus élevé en moyenne qu'OpenSearch FAISS." /><h4>Rappel @ 10 - Détaillé</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ecb02d4a2967dbd/6a1709bf14b270c04fe3c5c6/a7459b87e679f4ad963d0e2f1685499b40f6f050-1600x799.png" alt="Comparaison détaillée du temps de latence recall@10 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt182da309ad6cfd39/6a1709c166c4f99077f8bfd8/c6036f55a13377654d296eb3148c7199e1965475-1600x799.png" alt="Comparaison détaillée du taux de rappel@10 entre Elasticsearch BBQ et Opensearch FAISS." /><p></p><p>tâche</p><p>latence.moyenne</p><p>débit.moyen</p><p>avg_recall</p><p>Elasticsearch-9.0-BBQ</p><p>10-100-100</p><p>11.70</p><p>513.58</p><p>0.89</p><p>Elasticsearch-9.0-BBQ</p><p>10-1000-100</p><p>27.33</p><p>250.55</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-1500-1500</p><p>35.93</p><p>197.26</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-200-200</p><p>13.33</p><p>456.16</p><p>0.92</p><p>Elasticsearch-9.0-BBQ</p><p>10-2000-2000</p><p>44.27</p><p>161.40</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-40-40</p><p>10.97</p><p>539.94</p><p>0.84</p><p>Elasticsearch-9.0-BBQ</p><p>10-50-50</p><p>11.00</p><p>535.73</p><p>0.85</p><p>Elasticsearch-9.0-BBQ</p><p>10-500-500</p><p>19.52</p><p>341.45</p><p>0.93</p><p>Elasticsearch-9.0-BBQ</p><p>10-750-750</p><p>22.94</p><p>295.19</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>10-100-100</p><p>35.59</p><p>200.61</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>10-1000-1000</p><p>156.81</p><p>58.30</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-1500-1500</p><p>181.79</p><p>42.97</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-200-200</p><p>47.91</p><p>155.16</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>10-2000-2000</p><p>232.14</p><p>31.84</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-40-40</p><p>27.55</p><p>249.25</p><p>0.92</p><p>OpenSearch-2.19-faiss</p><p>10-50-50</p><p>28.78</p><p>245.14</p><p>0.92</p><p>OpenSearch-2.19-faiss</p><p>10-500-500</p><p>79.44</p><p>97.06</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-750-750</p><p>104.19</p><p>75.49</p><p>0.96</p><h3>Rappel à 50 ans - simplifié</h3><p>À ce niveau de rappel, Elasticsearch BBQ est jusqu <strong>'à 5 fois plus rapide</strong> (4,2 fois plus rapide en moyenne) et a un <strong>débit 3,9 fois plus élevé</strong> en moyennequ'OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt486683f2c7a1d677/6a1709c2a6c2b995bde796a3/3189ffb330948b35854eeea9ae317d4846c14972-1600x681.png" alt="Comparaison des performances vectorielles de Recal @50 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba830c6741784682/6a1709c4a292990627d00ff7/607383d674dcf0b8f94bfb1a450063f52fcbeb15-2060x876.png" alt="Elasticsearch BBQ est jusqu'à 5 fois plus rapide (4,2 fois plus rapide en moyenne) et a un débit 3,9 fois plus élevé en moyenne qu'OpenSearch FAISS." /><h4>Résultats détaillés - Rappel à 50</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt821775e7f87e5ede/6a1709c6a6c2b90af3e796a7/ebfffe0b776aad31dd03d315cfbf5aa098b41226-1600x789.png" alt="Recall@50 Elasticsearch BBQ et Opensearch FAISS résultats de latence" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4f47784ed1017c15/6a1709c7e8fbce0fbe39fbf5/ae20cf870a65c400a2112bbad62eb56e244f549a-1600x799.png" alt="Recall@50 Elasticsearch BBQ et Opensearch FAISS résultats de débit" /><p></p><p>Tâche</p><p>Latence Moyenne</p><p>Débit moyen</p><p>Rappel moyen</p><p>Elasticsearch-9.0-BBQ</p><p>50-1000-1000</p><p>25.71</p><p>246.44</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>50-1200-1200</p><p>28.81</p><p>227.85</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>50-150-150</p><p>13.43</p><p>362.90</p><p>0.90</p><p>Elasticsearch-9.0-BBQ</p><p>50-1500-1500</p><p>33.38</p><p>202.37</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>50-200-200</p><p>12.99</p><p>406.30</p><p>0.91</p><p>Elasticsearch-9.0-BBQ</p><p>50-2000-2000</p><p>42.63</p><p>163.68</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>50-250-250</p><p>14.41</p><p>373.21</p><p>0.92</p><p>Elasticsearch-9.0-BBQ</p><p>50-500-500</p><p>17.15</p><p>341.04</p><p>0.93</p><p>Elasticsearch-9.0-BBQ</p><p>50-750-750</p><p>31.25</p><p>248.60</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>50-1000-1000</p><p>125.35</p><p>62.53</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>50-1200-1200</p><p>143.87</p><p>54.75</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>50-150-150</p><p>43.64</p><p>130.01</p><p>0.89</p><p>OpenSearch-2.19-faiss</p><p>50-1500-1500</p><p>169.45</p><p>46.35</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>50-200-200</p><p>48.05</p><p>156.07</p><p>0.91</p><p>OpenSearch-2.19-faiss</p><p>50-2000-2000</p><p>216.73</p><p>36.38</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>50-250-250</p><p>53.52</p><p>142.44</p><p>0.93</p><p>OpenSearch-2.19-faiss</p><p>50-500-500</p><p>78.98</p><p>97.82</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>50-750-750</p><p>103.20</p><p>75.86</p><p>0.96</p><h3>Rappel à 100</h3><p>À ce niveau de rappel, Elasticsearch BBQ est jusqu <strong>'à 5 fois plus rapide </strong>(en moyenne 4,6 fois plus rapide) et a un <strong>débit 3,9 fois plus élevé </strong>en moyenne qu'OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt380eb9165343a7b3/6a1709c9acf0882669be9ac5/d3f29db64cbde9956de1fa3ae64a75f15141a2bb-1600x681.png" alt="Rappeler @100 résultats Elasticsearch BBQ VS Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt505ce8aa70898390/6a1709cb1949f73a37e7a9bb/10aff7f8c61fdac895b9ba9c5342baf239ba3ffc-2072x864.png" alt="Comparaison des performances d'Elasticsearch BBQ et d'Opensearch FAISS en termes de latence et de débit" /><h4>Résultats détaillés - Rappel à 100</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2a73e29940e9d6b/6a1709cccf4f257615b2d138/8790fdf9512b850447f6875fb69969f6f1d4da5f-1600x799.png" alt="Résultats détaillés de la latence - Rappel @ 100 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c91ca21da03d96/6a1709ce0c4857d3fc01aa39/d47032fac6c288cd4eedd9f25001e417b2fa9d65-1600x787.png" alt="Résultats détaillés du débit - Rappel @ 100 Elasticsearch BBQ vs Opensearch FAISS." /><p></p><p>tâche</p><p>latence.moyenne</p><p>débit.moyen</p><p>avg_recall</p><p>Elasticsearch-9.0-BBQ</p><p>100-1000-1000</p><p>27.82</p><p>243.22</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-1200-1200</p><p>31.14</p><p>224.04</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-1500-1500</p><p>35.98</p><p>193.99</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-200-200</p><p>14.18</p><p>403.86</p><p>0.88</p><p>Elasticsearch-9.0-BBQ</p><p>100-2000-2000</p><p>45.36</p><p>159.88</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-250-250</p><p>14.77</p><p>433.06</p><p>0.90</p><p>Elasticsearch-9.0-BBQ</p><p>100-300-300</p><p>14.61</p><p>375.54</p><p>0.91</p><p>Elasticsearch-9.0-BBQ</p><p>100-500-500</p><p>18.88</p><p>340.37</p><p>0.93</p><p>Elasticsearch-9.0-BBQ</p><p>100-750-750</p><p>23.59</p><p>285.79</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>100-1000-1000</p><p>142.90</p><p>58.48</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>100-1200-1200</p><p>153.03</p><p>51.04</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>100-1500-1500</p><p>181.79</p><p>43.20</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>100-200-200</p><p>50.94</p><p>131.62</p><p>0.83</p><p>OpenSearch-2.19-faiss</p><p>100-2000-2000</p><p>232.53</p><p>33.67</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>100-250-250</p><p>57.08</p><p>131.23</p><p>0.87</p><p>OpenSearch-2.19-faiss</p><p>100-300-300</p><p>62.76</p><p>120.10</p><p>0.89</p><p>OpenSearch-2.19-faiss</p><p>100-500-500</p><p>84.36</p><p>91.54</p><p>0.93</p><p>OpenSearch-2.19-faiss</p><p>100-750-750</p><p>111.33</p><p>69.95</p><p>0.94</p><h2>Améliorations apportées au barbecue</h2><p>BBQ a beaucoup évolué depuis sa première version. Pour Elasticsearch 8.16, à des fins de comparaison, nous avons inclus un benchmark de la version 8.16 avec le benchmark actuel, et nous pouvons voir comment le rappel et la latence se sont améliorés depuis.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f1f7ae1bb425a3a/6a1709cf67045bde8e45c192/45a0acfe5985bff28ccada76ec4eca190fe65f72-1600x799.png" alt="Améliorations de la latence et du rappel d'Elasticsearch 9.0 BBQ comparées à Elasticsearch 8.16 BBQ" /><p>Dans Elasticsearch 8.18 et 9.0, nous avons réécrit l'algorithme de base pour quantifier les vecteurs. Ainsi, si BBQ 8.16 était bien, les versions les plus récentes sont encore meilleures. Pour en savoir plus, <a href="https://www.elastic.co/fr/search-labs/blog/optimized-scalar-quantization-elasticsearch">cliquez ici</a> et <a href="https://www.elastic.co/fr/search-labs/blog/scalar-quantization-optimization">ici.</a> En bref, chaque vecteur est quantifié individuellement au moyen de quantiles scalaires optimisés. Ainsi, les utilisateurs bénéficient d'une plus grande précision dans la recherche vectorielle sans compromettre les performances, ce qui rend la recherche vectorielle d'Elasticsearch encore plus puissante.</p><h2>Conclusion</h2><p>Dans cette comparaison de performances entre Elasticsearch BBQ et OpenSearch FAISS, Elasticsearch surpasse de manière significative OpenSearch pour la recherche vectorielle, atteignant des vitesses de requête jusqu'à 5 fois plus rapides et un débit 3,9 fois plus élevé en moyenne pour différents niveaux de rappel.</p><p>Les principales conclusions sont les suivantes :</p><ul><li><p><strong>Recall@10</strong>: Elasticsearch BBQ est jusqu'à 5 fois plus rapide (3,9 fois plus rapide en moyenne) et a un débit 3,2 fois plus élevé en moyenne par rapport à OpenSearch FAISS.</p></li><li><p><strong>Recall@50</strong>: Elasticsearch BBQ est jusqu'à 5 fois plus rapide (4,2 fois plus rapide en moyenne) et a un débit 3,9 fois plus élevé en moyenne par rapport à OpenSearch FAISS.</p></li><li><p><strong>Recall@100</strong>: Elasticsearch BBQ est jusqu'à 5 fois plus rapide (4,6 fois plus rapide en moyenne) et a un débit 3,9 fois plus élevé en moyenne par rapport à OpenSearch FAISS.</p></li></ul><p>Ces résultats mettent en évidence les avantages d'Elasticsearch BBQ en termes d'efficacité et de performances, en particulier dans les scénarios de recherche vectorielle à haute dimension. La technique BBQ (Better Binary Quantization), introduite dans Elasticsearch 8.16, permet une réduction substantielle de la mémoire (~95%) tout en maintenant une qualité de classement élevée, ce qui en fait un choix supérieur pour les applications de recherche vectorielle à grande échelle.</p><p>Chez Elastic, nous innovons sans cesse pour améliorer Apache Lucene et Elasticsearch afin de fournir la meilleure base de données vectorielle pour les cas d'utilisation de recherche et d'extraction, y compris RAG (Retrieval Augmented Generation). Nos <a href="https://www.elastic.co/fr/search-labs/blog/optimized-scalar-quantization-elasticsearch">récentes avancées</a> ont considérablement augmenté les performances, rendant la recherche vectorielle plus rapide et plus efficace en termes d'espace qu'auparavant, en s'appuyant sur les gains de Lucene 10. Ce blog est une autre illustration de cette innovation.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-bbq-vs-opensearch-faiss</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-bbq-vs-opensearch-faiss</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <dc:creator><![CDATA[Ugo Sangiorgi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd76ada1eebfe05cd/6a1709d1a29299ed29d00ffb/796de4829e29566f1f3efa2482f5c3e54b31b1d6-1536x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Elasticsearch et OpenSearch : comparatif de performance pour la recherche vectorielle.]]></title>
    <description><![CDATA[Elasticsearch est d’emblée 2 à 12 fois plus rapide qu’OpenSearch pour la recherche vectorielle]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison#up-to-12x-faster-out-of-the-box">Elasticsearch est jusqu’à 12 fois plus rapide</a> - Chez Elastic, suite aux nombreuses requêtes de notre communauté concernant les écarts de performance entre Elasticsearch et OpenSearch, notamment dans la recherche sémantique et vectorielle, nous avons mené cette série de tests. Le but est d’offrir une comparaison claire et axée sur les données, sans ambiguïté, avec des faits simples pour informer nos utilisateurs. Les résultats montrent qu'<strong>Elasticsearch est jusqu'à 12 fois plus rapide</strong> qu'OpenSearch pour la recherche vectorielle et nécessite donc moins de ressources informatiques. Cela reflète la volonté d’Elastic de se concentrer sur la consolidation de Lucene comme la meilleure base de données vectorielles pour les cas d’utilisation de recherche et de récupération.</p><p>La recherche vectorielle est en train de révolutionner la manière dont nous effectuons les recherches par similarité, en particulier dans des domaines comme l’IA et le Machine Learning. Face à l’adoption de plus en plus répandue des modèles d’intégration de vecteurs, la capacité de rechercher efficacement à travers des millions de vecteurs de haute dimension devient cruciale.</p><p>Elastic et OpenSearch ont choisi des approches très distinctes pour l’exécution des bases de données vectorielles. Pour que ses produits soient le meilleur choix pour les applications de recherche vectorielle, Elastic a investi massivement dans l’optimisation d’Apache Lucene avec Elasticsearch. En revanche, OpenSearch a élargi son champ d’action en intégrant d’autres implémentations de recherche vectorielle et en explorant au-delà de la portée de Lucene. En nous concentrant de manière stratégique sur Lucene, nous pouvons proposer un soutien très intégré dans notre version d’Elasticsearch. Il en résulte un ensemble de fonctionnalités amélioré, où chaque composant complète et amplifie les capacités de l’autre.</p><p>Ce blog offre une comparaison détaillée entre Elasticsearch 8.14 et OpenSearch 2.14, en se basant sur différentes configurations et différents moteurs vectoriels. Dans cette analyse des performances, Elasticsearch s'est avéré être la plateforme supérieure pour les opérations de recherche vectorielle, et les <a href="https://www.elastic.co/search-labs/blog/vector-similarity-computations-ludicrous-speed">fonctionnalités</a> à venir creuseront encore davantage l'<a href="https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">écart</a>. Comparé à OpenSearch, il a excellé dans tous les domaines de référence — <strong>offrant des performances 2 à 12 fois plus rapides en moyenne</strong>. Cela s’est produit dans des scénarios utilisant des quantités et des dimensions de vecteurs variables, notamment <code>so_vector</code> (2 millions de vecteurs, 768D), <code>openai_vector</code> (2,5 millions de vecteurs, 1536D) et <code>dense_vector</code> (10 millions de vecteurs, 96D), tous disponibles dans <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance">ce référentiel</a> aux côtés des scripts Terraform pour provisionner toute l’infrastructure requise sur Google Cloud et les manifestes Kubernetes pour exécuter les tests.</p><p>Les résultats de ce blog s’ajoutent à ceux d'une étude <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap">validée par une tierce partie et publiée précédemment</a>. L’étude avait révélé qu’Elasticsearch est plus rapide de 40%–140% qu’OpenSearch en ce qui concerne les opérations d’analyse de recherche les plus courantes : requêtes textuelles, tri, plages, histogramme de dates et filtrage par termes. Maintenant, nous pouvons ajouter un autre facteur de différenciation : la recherche vectorielle. Maintenant, nous pouvons ajouter un autre facteur de différenciation : la recherche vectorielle.</p><h2>Jusqu’à 12 fois plus rapide d’emblée</h2><p>Nos tests d'évaluation ciblés sur les quatre ensembles de données vectorielles impliquaient à la fois des recherches KNN approximatives et KNN exactes, en tenant compte de différentes tailles, dimensions et configurations, totalisant <code>40.189.820</code> demandes de rechercher non mises en cache. Les résultats : <strong>Elasticsearch est jusqu'à 12 fois plus rapide</strong> qu'OpenSearch pour la recherche vectorielle et nécessite donc moins de ressources de calcul.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34b83c6eba3bcb6e/6a17d727dbb4ff18d6fb54fb/cdb26e91f085b90e9b12aeb8fee53b04d365ecae-1440x1156.webp" alt="p90 moyen" /><p>Figure 1 : Tâches groupées pour ANN et KNN exact dans différentes combinaisons dans Elasticsearch et OpenSearch.</p><p>Les groupes tels que <code>knn-10-100</code> signifient une rechercher KNN avec  et . Dans la recherche vectorielle HNSW,  détermine le nombre de voisins les plus proches à récupérer pour un vecteur de requête. Il définit le nombre de vecteurs similaires qui seront renvoyés en résultat.  définit le nombre de vecteurs candidats à récupérer à chaque segment. Un plus grand nombre de candidats peut renforcer la précision, au prix de ressources de calcul plus importantes.</p><p>Après avoir testé différentes techniques de quantification et tiré parti des optimisations spécifiques à chaque moteur, nous avons obtenu des résultats détaillés pour chaque piste, tâche et moteur vectoriel, que vous trouverez ci-dessous.</p><h2>KNN exact et KNN approximatif</h2><p>Pour des ensembles de données et des cas d’utilisation variés, l’approche appropriée pour la recherche vectorielle variera. Dans ce blog, toutes les tâches indiquées comme <code>knn-*</code> comme <code>knn-10-100</code> utilisent <strong>Approximate KNN</strong> et <code>script-score-*</code> font référence à <strong>Exact KNN</strong>, mais quelle est la différence entre elles et pourquoi sont-elles importantes ?</p><p>Grâce à sa plus grande évolutivité, la méthode de l’algorithme des plus proches voisins approximatifs (ANN) est la solution préférée lorsque vous traitez des ensembles de données plus substantiels. La méthode des plus proches voisins exacts (KNN) est idéale pour les jeux de données plus modestes qui nécessitent parfois un processus de filtrage.</p><p>La méthode du KNN exact emploie une approche par la force brute, qui consiste à calculer la distance entre un vecteur et chaque autre vecteur du jeu de données. Elle classe ensuite ces distances pour trouver les  voisins les plus proches. Même si cette méthode assure une correspondance exacte, elle fait face à des problèmes d’évolutivité pour les jeux de données volumineux et à haute dimension. Toutefois, il y a de nombreuses situations dans lesquelles le recours au KNN exact est requis :</p><ul><li><p><strong>Réévaluation</strong>: dans les cas qui impliquent des recherches lexicales ou sémantiques suivies d’une réévaluation basée sur les vecteurs, le KNN exact est indispensable. Dans un moteur de recherche de produits, par exemple, on peut d’abord filtrer les résultats de recherche initiaux à l’aide de requêtes textuelles (mots-clés, catégories), puis utiliser les vecteurs associés aux éléments filtrés pour une évaluation de similarité plus précise.</p></li><li><p><strong>Personnalisation</strong>: dans le cas d'un grand nombre d'utilisateurs, dont chacun est représenté par un nombre relativement peu élevé (environ 1 million) de vecteurs distincts, le classement de l'index en fonction des métadonnées de l'utilisateur (p. ex., user_id) et le score par force brute avec des vecteurs deviennent efficaces. Cette approche permet de fournir des recommandations personnalisées ou un contenu personnalisé, en fonction de comparaisons de vecteurs précises qui sont spécifiquement conçues pour les préférences de chaque utilisateur.</p></li></ul><p>Le KNN exact permet d’assurer un classement final et des recommandations précis et adaptés aux préférences de l’utilisateur, car ils sont fondés sur la similarité vectorielle.</p><p>D’un autre côté, le KNN approximatif (ANN) utilise des méthodes qui rendent la recherche de données plus rapide et plus efficace que le KNN exact, en particulier dans les jeux de données volumineux et à haute dimension. Contrairement à une approche par force brute qui mesure la distance exacte entre une requête et tous les points (ce qui pose des défis de calcul et de mise à l’échelle), l’ANN recourt à des techniques spécifiques afin de restructurer efficacement les index et les dimensions des vecteurs interrogeables dans l’ensemble de données. Même si cela peut entraîner une légère inexactitude, cela accélère considérablement le processus de recherche, ce qui en fait une solution de rechange efficace pour les ensembles de données volumineux.</p><p>Dans ce blog, toutes les tâches indiquées comme <code>knn-*</code> comme <code>knn-10-100</code> utilisent <strong>KNN approximatif</strong> et <code>script-score-*</code> font référence à <strong>KNN exact</strong>.</p><h2>Méthodologie de test</h2><p>Même si l'API des opérations de recherche BM25 est similaire pour Elasticsearch et OpenSearch (puisque ce dernier est une copie du premier), cela ne s’applique pas à la recherche vectorielle, laquelle a été introduite après la copie. OpenSearch a adopté une approche différente d’Elasticsearch en ce qui concerne les algorithmes, en introduisant deux autres moteurs - <code>nmslib</code> et <code>faiss</code> <code>lucene</code>plus , chacun avec ses configurations et limitations spécifiques (par exemple, <code>nmslib</code> dans OpenSearch n’autorise pas les filtres, une fonctionnalité essentielle pour de nombreux cas d’utilisation).</p><p>Les trois moteurs emploient l’algorithme HNSW, lequel est très performant pour la recherche approximative des plus proches voisins et particulièrement puissant en présence de données de grande dimension. Il est important de noter que <code>faiss</code> prend également en charge un deuxième algorithme, <code>ivf</code>, mais comme il nécessite une formation préalable sur l'ensemble de données, nous allons nous concentrer uniquement sur HNSW. Le concept principal de HNSW est d’organiser les données en couches de graphes connectés, où chaque couche reflète une granularité différente de l’ensemble de données. La recherche s’amorce à la couche supérieure, qui propose la vue la plus grossière. Elle progresse ensuite vers des couches de plus en plus fines jusqu’au niveau de base.</p><p>Les deux moteurs de recherche ont fait l’objet de tests dans un cadre contrôlé, sous des conditions strictement identiques, afin de garantir un terrain d'essai équitable. La méthode utilisée est comparable à <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap#testing-methodology">la comparaison de performance publiée précédemment</a>, avec des groupes de nœuds dédiés pour Elasticsearch, OpenSearch et Rally. Le <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/main/terraform/main.tf">script terraform</a> est disponible (ainsi que toutes les sources) pour provisionner un cluster Kubernetes avec :</p><ul><li><p>1 pool de nœuds pour Elasticsearch avec 3 machines <code>e2-standard-32</code> (128 Go de RAM et 32 processeurs)</p></li><li><p>1 pool de nœuds pour OpenSearch avec 3 machines <code>e2-standard-32</code> (128 Go de RAM et 32 processeurs)</p></li><li><p>1 pool de nœuds pour Rally avec 2 machines <code>t2a-standard-16</code> (64 Go de RAM et 16 processeurs)</p></li></ul><p>Chaque test (ou piste) a été exécuté à 10 reprises pour chaque configuration, qui incluait différents moteurs, différentes configurations et différents types de vecteurs. Chaque piste se compose de tâches qui sont répétées de 1000 à 10 000 fois, en fonction de la piste. En cas d'échec d’une tâche dans une piste (en raison, par exemple, d’une temporisation de réseau), toutes les tâches sont abandonnées. C’est pourquoi tous les résultats sont issus de pistes qui ont démarré et se sont terminées sans problème. L’ensemble des résultats de test sont validés sur le plan statistique, ce qui assure que les améliorations ne sont pas le résultat d’une coïncidence.</p><h2>Résultats détaillés</h2><p>Pourquoi comparer en utilisant le 99e percentile et non la latence moyenne ? Prenons un exemple hypothétique du prix moyen des logements dans un quartier donné. Le prix moyen peut laisser penser que la zone est onéreuse, mais en y regardant de plus près, il peut se révéler que la plupart des logements sont évalués à un prix beaucoup plus bas, et que seules quelques propriétés de luxe font augmenter la moyenne. Le prix moyen peut ne pas refléter avec précision la gamme complète des valeurs des maisons dans la région, comme l’illustre cet exemple. C’est comparable à l’étude des temps de réponse, où le chiffre moyen peut dissimuler des enjeux critiques.</p><h4>Tâches</h4><ul><li><p>KNN approximatif avec k :10 n :50</p></li><li><p>KNN approximatif avec k : 10 n : 100</p></li><li><p>KNN approximatif avec k : 100 n : 1 000</p></li><li><p>KNN approximatif avec k :10, n :50 et filtres de mots-clés</p></li><li><p>KNN approximatif avec k : 10, n : 100 et filtres de mots-clés</p></li><li><p>KNN approximatif avec k :100, n :1000 et filtres de mots-clés</p></li><li><p>KNN approximatif avec k:10 n:100 en conjonction avec l'indexation</p></li><li><p>KNN exact (score du script)</p></li></ul><h4>Moteurs vectoriels</h4><ul><li><p><code>lucene</code> dans Elasticsearch et OpenSearch, tous deux en version 9.10</p></li><li><p><code>faiss</code> dans OpenSearch</p></li><li><p><code>nmslib</code> dans OpenSearch</p></li></ul><h4>Types de vecteurs</h4><ul><li><p><code>hnsw</code> dans Elasticsearch et OpenSearch</p></li><li><p><code>int8_hnsw</code> dans Elasticsearch (HNSW avec quantification automatique 8 bits–: <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">lien</a>)</p></li><li><p><code>sq_fp16 hnsw </code>dans OpenSearch (HNSW avec quantification automatique 16 bits : <a href="https://opensearch.org/docs/2.14/search-plugins/knn/knn-vector-quantization#faiss-16-bit-scalar-quantization">lien</a>)</p></li></ul><h4>Recherche prête à l'emploi et recherche de segments simultanés</h4><p>Lucene est une bibliothèque de moteur de recherche de texte hautement performante, rédigée en Java. Elle constitue la pierre angulaire de nombreuses plateformes de recherche, telles qu’Elasticsearch, OpenSearch et Solr. Le cœur du système de Lucene repose sur l’organisation des données en segments. Ces segments sont des index autonomes qui permettent d’exécuter les recherches plus efficacement. Donc, si vous effectuez une recherche sur un moteur basé sur Lucene, cette recherche sera exécutée dans ces segments, de manière séquentielle ou en parallèle.</p><p>OpenSearch a introduit la recherche de segments simultanés en tant qu’indicateur facultatif et ne l’utilise pas par défaut, vous devez l’activer à l’aide d’un paramètre d’index spécial <code>index.search.concurrent_segment_search.enabled</code> comme détaillé <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/">ici</a>, avec certaines <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/#other-considerations">limitations</a>.</p><p>En revanche, Elasticsearch effectue des recherches sur les segments en parallèle <a href="https://github.com/elastic/elasticsearch/pull/101230">par défaut</a>. C’est pourquoi les comparaisons que nous effectuons dans cet article de blog tiendront compte, outre des différents moteurs et types de vecteurs, des différentes configurations également :</p><ul><li><p>Elasticsearch ootb : Elasticsearch prêt à l'emploi, avec recherche de segments simultanés ;</p></li><li><p>OpenSearch ootb : sans activation de la recherche par segments simultanés ;</p></li><li><p>OpenSearch css : avec la recherche par segments simultanés activée</p></li></ul><p>À présent, examinons en détail les résultats pour chaque ensemble de données vectorielles qui a été testé :</p><h2>2,5 millions de vecteurs, 1536 dimensions (openai_vector)</h2><p>En commençant par la piste la plus simple, mais aussi la plus grande en termes de dimensions, <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> - qui utilise l'<a href="https://huggingface.co/datasets/BeIR/nq">ensemble de données NQ</a> enrichi avec des intégrations générées à l'aide du <a href="https://openai.com/blog/new-and-improved-embedding-model">modèle text-embedding-ada-002</a> d'OpenAI. Il s'agit du plus simple, du fait qu’il ne teste que le KNN approximatif et qu'il ne comporte que 5 tâches. Les tests sont effectués en mode autonome (sans indexation) de même qu’en conjonction avec l’indexation, et avec un seul client ou 8 clients simultanés.</p><h3>Tâches</h3><ul><li><p><strong>standalone-search-knn-10-100-multiple-clients</strong> : recherche sur 2,5 millions de vecteurs avec 8 clients simultanément, k : 10 et n :100</p></li><li><p><strong>standalone-search-knn-100-1000-multiple-clients</strong> : recherche sur 2,5 millions de vecteurs avec 8 clients simultanément, k : 100 et n : 1000</p></li><li><p><strong>standalone-search-knn-10-100-single-client</strong>: recherche sur 2,5 millions de vecteurs avec un seul client, k : 10 et n : 100</p></li><li><p><strong>standalone-search-knn-100-1000-single-client</strong>: recherche sur 2,5 millions de vecteurs avec un seul client, k : 100 et n : 1000</p></li><li><p><strong>parallel-documents-indexing-search-knn-10-100</strong>: indexation sur 2,5 millions de vecteurs tout en recherchant 100 000 documents supplémentaires, k : 10 et n : 100</p></li></ul><p>Les performances moyennes de p99 sont décrites ci-dessous :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5791848eb0c12fb/6a17d72925daab9cae08a09e/eea0b2b49c690baada3e09d6968e513bfffe51a9-1440x318.webp" alt="tableau openai_vector" /><p>Nous avons constaté ici qu’Elasticsearch est <strong>3 à 8 fois plus rapide</strong> qu’OpenSearch lors d’une recherche vectorielle effectuée en parallèle de l'indexation (c’est-à-dire. lecture+écriture) avec :10 et :100 et <strong>2 à 3 fois plus rapide</strong> sans indexation pour les mêmes k et n. Pour :100 et :1000 (<em>standalone-rechercher-knn-100-1000-single-client</em> et <em>standalone-rechercher-knn-100-1000-multiple-clients</em> Elasticsearch est <strong>2 à 7 fois</strong> plus rapide qu'OpenSearch, en moyenne.</p><p>Les résultats détaillés montrent les cas exacts et les moteurs vectoriels comparés :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbe41d3187ced7ec/6a17d72a445de951c44cff4c/a7a761ed631d3e6211beb83d9d93d752d10123c9-1440x1728.webp" alt="openai_vector" /><h4>Rappel</h4><p></p><p>knn-recall-10-100</p><p>knn-recall-100-1000</p><p>Elasticsearch-8.14.0@lucene-hnsw</p><p>0,969485</p><p>0,995138</p><p>Elasticsearch-8.14.0@lucene-int8_hnsw</p><p>0,781445</p><p>0,784817</p><p>OpenSearch-2.14.0@lucene-hnsw</p><p>0,96519</p><p>0,995422</p><p>OpenSearch-2.14.0@faiss</p><p>0,984154</p><p>0,98049</p><p>OpenSearch-2.14.0@faiss-sq_fp16</p><p>0,980012</p><p>0,97721</p><p>OpenSearch-2.14.0@nmslib</p><p>0,982532</p><p>0,99832</p><h2>10 millions de vecteurs, 96 dimensions (dense_vector)</h2><p><a href="https://github.com/elastic/rally-tracks/tree/master/dense_vector">dense_vector</a> avec 10 millions de vecteurs et 96 dimensions. Il est basé sur le jeu de données d'images <a href="https://big-ann-benchmarks.com/">Yandex DEEP1B</a>. Le jeu de données est créé à partir des 10 premiers millions de vecteurs du fichier « données d’échantillon » appelé <code>learn.350M.fbin</code>. Les opérations de recherche font appel à des vecteurs qui proviennent du fichier de « requêtes de données » query.<code>public.10K.fbin</code>.</p><p>Après une <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html">fusion forcée</a>, qui est habituellement effectuée sur des index en lecture seule, Elasticsearch et OpenSearch sont très performants sur cet ensemble de données. Cette opération est similaire à une défragmentation, ce qui permet d’avoir une seule « table » pour la recherche.</p><h3>Tâches</h3><p>Chaque tâche fait l'objet d’un préchauffage de 100 requêtes, et la mesure est ensuite effectuée sur les 1000 requêtes suivantes</p><ul><li><p><strong>knn-search-10-100</strong>: recherche sur 10 millions de vecteurs, k : 10 et n : 100</p></li><li><p><strong>knn-search-100-1000</strong>: recherche sur 10 millions de vecteurs, k : 100 et n : 1000</p></li><li><p><strong>knn-search-10-100-force-merge</strong>: recherche sur 10 millions de vecteurs après une fusion forcée, k : 10 et n : 100</p></li><li><p><strong>knn-search-100-1000-force-merge</strong>: recherche sur 10 millions de vecteurs après une fusion forcée, k : 100 et n :1000</p></li><li><p><strong>knn-search-100-1000-concurrent-with-indexing</strong>: indexation sur 10 millions de vecteurs tout en mettant à jour <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/challenges/default.json#L76C36-L76C37">5 % de l'ensemble de données</a>, k : 100 et n : 1000</p></li><li><p><strong>script-score-query</strong>: recherche KNN exacte de <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/queries.json">2000 vecteurs spécifiques</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4629d06af85eb96c/6a17d72c6864a423e7b685dc/174995e0a2156d86359cdb7aa446dfaae6312ea4-1440x316.webp" alt="dense_vector" /><p>Elasticsearch et OpenSearch ont tous deux obtenu de bons résultats pour le KNN approximatif. Lorsque l’index est fusionné (c’est-à-dire qu’il n’a qu’un seul segment) dans <em>knn-rechercher-100-1000-force-merge</em> et <em>knn-rechercher-10-100-force-merge</em>, OpenSearch fonctionne mieux que les autres lors de l’utilisation de <code>nmslib</code> et <code>faiss</code>, même s’ils sont tous autour de 15 ms et tous très proches.</p><p>Lorsque l'index a plusieurs segments (ce qui est typique lorsqu'un index reçoit des mises à jour), Elasticsearch maintient la latence autour de ~7ms et ~16ms dans les tests <em>knn-search-10-100</em> et <em>knn-search-100-1000</em>, tandis que tous les autres moteurs OpenSearch sont plus lents.</p><p>Lorsque l'index est interrogé et mis à jour simultanément (<em>knn-search-100-1000-concurrent-with-indexing</em>), Elasticsearch maintient une latence inférieure à 15 ms (13,8 ms). Il est presque <strong>4 fois plus rapide</strong> qu’OpenSearch par défaut (49,3 ms) et reste plus rapide lorsque la recherche concurrente de segments est activée (17,9 ms), bien que la différence ne soit pas significative.</p><p>En ce qui concerne le KNN exact, l’écart est bien plus important : Elasticsearch <strong>est 6 fois plus rapide</strong> qu’OpenSearch (~260 ms contre ~1600 ms).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt254f43bcaa3dbfc2/6a17d72ddbb4ffc780fb54ff/17aec6be31117440bc4d1f99984aed95df1c4f6b-1440x1728.webp" alt="dense_vector" /><h4>Rappel</h4><p></p><p>knn-recall-10-100</p><p>knn-recall-100-1000</p><p>Elasticsearch-8.14.0@lucene-hnsw</p><p>0,969843</p><p>0,996577</p><p>Elasticsearch-8.14.0@lucene-int8_hnsw</p><p>0,775458</p><p>0,840254</p><p>OpenSearch-2.14.0@lucene-hnsw</p><p>0,971333</p><p>0,996747</p><p>OpenSearch-2.14.0@faiss</p><p>0,9704</p><p>0,914755</p><p>OpenSearch-2.14.0@faiss-sq_fp16</p><p>0,968025</p><p>0,913862</p><p>OpenSearch-2.14.0@nmslib</p><p>0,9674</p><p>0,910303</p><h2>2 millions de vecteurs, 768 dimensions (so_vector)</h2><p>Cette <a href="https://github.com/elastic/rally-tracks/tree/master/so_vector">piste</a>, <code>so_vector</code>, est dérivée d’une <a href="https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z">extraction des publications de StackOverflow téléchargée</a> le 21 avril 2022. Seuls les documents de questions y figurent, les documents de réponses ayant tous été supprimés. Chaque titre de question a été encodé dans un vecteur en utilisant le modèle de transformateur de phrase <a href="https://huggingface.co/sentence-transformers/multi-qa-mpnet-base-cos-v1">multi-qa-mpnet-base-cos-v1</a>. Cet ensemble de données contient les 2 premiers millions de questions.</p><p>Contrairement à la piste précédente, chaque document ici contient d'autres champs en plus des vecteurs pour prendre en charge le test de fonctionnalités comme le KNN approximatif avec filtrage et la recherche hybride. <code>nmslib</code> pour OpenSearch est notamment absent dans ce test car <a href="https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/#k-nn-search-with-filters">il ne prend pas en charge les filtres</a>.</p><h3>Tâches</h3><p>Chaque tâche fait l'objet d’un préchauffage de 100 requêtes, et la mesure est ensuite effectuée sur les 100 requêtes suivantes. Veuillez noter que les tâches ont été groupées dans un souci de simplicité, le test contenant 16 types de recherche, 2 valeurs k et 3 valeurs n différentes.</p><ul><li><p><strong>KNN-10-50</strong>: recherche sur 2 millions de vecteurs sans filtres, k :10 et n :50</p></li><li><p><strong>knn-10-50-filtered</strong>: recherche sur 2 millions de vecteurs <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">avec des filtres</a>, k :10 et n :50</p></li><li><p><strong>knn-10-50-after-force-merge</strong>: recherche sur 2 millions de vecteurs avec filtres et après une fusion forcée, k :10 et n :50</p></li><li><p><strong>KNN-10-100</strong>: recherche sur 2 millions de vecteurs sans filtres, k :10 et n :100</p></li><li><p><strong>knn-10-100-filtered</strong>: recherche sur 2 millions de vecteurs <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">avec des filtres</a>, k :10 et n :100</p></li><li><p><strong>knn-10-100-after-force-merge</strong>: recherche sur 2 millions de vecteurs avec filtres et après une fusion forcée, k :10 et n :100</p></li><li><p><strong>KNN-100-1000</strong>: Recherche sur 2 millions de vecteurs sans filtres, k :100 et n :1000</p></li><li><p><strong>knn-100-1000-filtered</strong>: recherche sur 2 millions de vecteurs <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">avec des filtres</a>, k :100 et n :1000</p></li><li><p><strong>knn-100-1000-after-force-merge</strong>: recherche sur 2 millions de vecteurs avec filtres et après une fusion forcée, k :100 et n :1000</p></li><li><p><strong>exact-knn</strong>: recherche KNN exacte <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json#L56">avec et sans filtres</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b44e1306af35877/6a17d72f577262aca11bca3e/d4ed2982d55370cad4b2048b23ce97caa55017c0-1440x316.webp" alt="table so_vector" /><p>Au cours de ce test, Elasticsearch est <strong>toujours plus rapide</strong> qu’OpenSearch par défaut, sauf dans deux cas où la différence n’est pas très grande (<em>knn-10-100</em> et <em>knn-100-1000</em>). Les tâches impliquant <em>knn-10-50</em>, <em>knn-10-100</em> et <em>knn-100-1000</em> en combinaison avec des filtres montrent une différence allant jusqu'à <strong>7x</strong> (112 ms contre 803 ms).</p><p>Les performances des deux solutions semblent s'équilibrer après une « fusion forcée », ce qui est compréhensible, comme en témoignent <em>knn-10-50-after-force-merge</em>, <em>knn-10-100-after-force-merge</em> et <em>knn-100-1000-after-force-merge.</em> Pour ces tâches, <code>faiss</code> est plus rapide.</p><p>La performance pour le KNN exact est à nouveau très différente : Elasticsearch est cette fois <strong>13 fois plus rapide</strong> qu’OpenSearch (~385 ms contre ~5262 ms).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf80ccc7c2df84559/6a17d7314b055de00d43203f/615cb9228eb05ddd2e9512b3a6a5bc88d4088a1a-1440x1440.webp" alt="so_vector" /><h4>Rappel</h4><p></p><p>knn-recall-10-100</p><p>knn-recall-100-1000</p><p>knn-recall-10-50</p><p>Elasticsearch-8.14.0@lucene-hnsw</p><p>1</p><p>1</p><p>1</p><p>Elasticsearch-8.14.0@lucene-int8_hnsw</p><p>1</p><p>0,986667</p><p>1</p><p>OpenSearch-2.14.0@lucene-hnsw</p><p>1</p><p>1</p><p>1</p><p>OpenSearch-2.14.0@faiss</p><p>1</p><p>1</p><p>1</p><p>OpenSearch-2.14.0@faiss-sq_fp16</p><p>1</p><p>1</p><p>1</p><p>OpenSearch-2.14.0@nmslib</p><p>0,9674</p><p>0,910303</p><p>0,976394</p><h2>Elasticsearch et Lucene, les vainqueurs incontestables</h2><p>Chez Elastic, nous innovons sans cesse avec Apache Lucene et Elasticsearch pour pouvoir proposer la meilleure base de données vectorielles pour les cas d'utilisation de recherche et de récupération, y compris la RAG (Génération augmentée de récupération). Nos avancées récentes ont considérablement amélioré les performances, rendant la recherche vectorielle <a href="https://search-labs.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">plus rapide et plus économe en espace</a> qu'auparavant, en s'appuyant sur les améliorations de Lucene 9.10. Ce blog présente une étude qui montre que lorsque l’on compare les versions les plus récentes, Elasticsearch est jusqu’à 12 fois plus rapide qu’OpenSearch.</p><p>Il convient de noter que les deux produits utilisent la même version de Lucene (<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-8.14.0.html">Notes de publication d'Elasticsearch 8.14</a> et <a href="https://github.com/opensearch-project/OpenSearch/blob/2.14/release-notes/opensearch.release-notes-2.14.0.md">Notes de publication d'OpenSearch 2.14</a>).</p><p>Le rythme d'innovation d'Elastic nous permettra d'aller encore plus loin, non seulement pour nos clients sur site et Elastic Cloud, mais aussi pour ceux qui utilisent notre <a href="https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">plateforme sans état.</a> Des fonctionnalités comme la prise en charge de la <a href="https://www.elastic.co/search-labs/blog/int4-scalar-quantization-in-lucene">quantification scalaire vers int4</a> seront proposées avec des tests rigoureux, afin que les clients puissent utiliser ces techniques sans une perte significative d'exactitude, de la même manière que <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">nos tests pour l’int8</a>.</p><p>La capacité d’une recherche vectorielle à être efficace est un critère non négociable pour les moteurs de recherche modernes, du fait de la prolifération des applications d’IA et de Machine Learning. Elasticsearch est la solution qui s’impose pour les organisations qui ont besoin d’un moteur de recherche puissant capable de gérer la demande en données vectorielles de grand volume et de haute complexité.</p><p>L’intégration d’Elasticsearch pour les besoins de recherche vectorielle, que ce soit pour étendre une plateforme établie ou lancer de nouveaux projets, représente une approche stratégique qui générera des bénéfices tangibles et à long terme. Fort de son avantage de performance avéré, Elasticsearch est bien placé pour sous-tendre la prochaine vague d’innovations dans la recherche.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison</guid>
    <category><![CDATA[Base vectorielle]]></category>
    <category><![CDATA[Lucene]]></category>
    <dc:creator><![CDATA[Ugo Sangiorgi]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5d70b25967c2194e/6a17d732b1e11383f879f0ca/13c3c0053e2968fb835ba2f90f34bec3a011b5c0-880x592.webp" length="0" type="image/webp"/>
    <pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>