<?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/de/search-labs/author/ugo-sangiorgi</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/author/ugo-sangiorgi</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/author/ugo-sangiorgi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Fri, 18 Sep 2026 15:32:54 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch BBQ vs. OpenSearch FAISS: Leistungsvergleich der Vektorsuche]]></title>
    <description><![CDATA[Ein Leistungsvergleich zwischen Elasticsearch BBQ und OpenSearch FAISS.]]></description>
    <content:encoded><![CDATA[<p><strong>Vektorsuche mit binärer Quantisierung: Elasticsearch mit BBQ ist 5x schneller als OpenSearch mit FAISS</strong>. Elastic hat von unserer Community Anfragen erhalten, die Leistungsunterschiede zwischen Elasticsearch und OpenSearch zu klären, insbesondere im Bereich der semantischen Suche/Vektorsuche. Daher haben wir diese Leistungstests durchgeführt, um klare, datenbasierte Vergleiche zu ermöglichen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8792b5284e7a553/6a1709b9961e69a084c4cee6/7f4f8d08f7bee188423e4e65f0caefc7e34f0355-1600x681.png" alt="Elasticsearch BBQ vs. OpenSearch FAISS – Vergleich von Geschwindigkeit, Durchsatz und Trefferquote" /><h2>Showdown der binären Quantisierung</h2><p>Das Speichern hochdimensionaler Vektoren in ihrer ursprünglichen Form kann speicherintensiv sein. Quantisierungstechniken komprimieren diese Vektoren in eine kompakte Darstellung und reduzieren so den Speicherbedarf drastisch. Die Suche erfolgt dann im komprimierten Raum, was den Rechenaufwand reduziert und die Suche insbesondere bei großen Datensätzen beschleunigt.</p><p>Elastic hat sich zum Ziel gesetzt, Lucene zu einer leistungsstarken Vektor-Engine zu machen. Wir haben <a href="https://www.elastic.co/de/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization</a> (BBQ) in Elasticsearch 8.16 auf Basis von Lucene eingeführt und in den Versionen 8.18 und 9.0 weiterentwickelt. BBQ basiert auf einem neuen Ansatz der <a href="https://www.elastic.co/de/search-labs/blog/optimized-scalar-quantization-elasticsearch">Skalarquantisierung</a> , der die float32-Dimensionen auf Bits reduziert und so eine Speicherreduzierung von ca. 95 % bei gleichzeitig hoher Ranking-Qualität ermöglicht.</p><p>OpenSearch hingegen verwendet mehrere Vektor-Engines: nmslib (jetzt veraltet), Lucene und FAISS. In einem <a href="https://www.elastic.co/de/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison">früheren Blog</a> haben wir Elasticsearch und OpenSearch für die Vektorsuche verglichen. Wir haben drei verschiedene Datensätze verwendet und unterschiedliche Kombinationen von Engines und Konfigurationen auf beiden Produkten getestet.</p><p>In diesem Blog geht es um die derzeit in beiden Produkten verfügbaren binären Quantisierungsalgorithmen. Wir haben Elasticsearch mit BBQ und OpenSearch mit <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">der binären Quantisierung von FAISS</a> unter Verwendung des <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> Rally-Tracks getestet.</p><p>Das Hauptziel bestand darin, die Leistung beider Lösungen bei gleichem Erinnerungsniveau zu bewerten. Was bedeutet <em>Rückruf</em> ? Die Rückrufquote ist eine Kennzahl, die misst, wie viele relevante Ergebnisse erfolgreich von einem Suchsystem abgerufen werden.</p><p>Bei dieser Auswertung ist insbesondere der Recall@k wichtig, wobei <em>k</em> die Anzahl der berücksichtigten Top-Ergebnisse darstellt. <strong>Recall@10</strong>, <strong>Recall@50 und Recall@100</strong> messen daher, wie viele der wirklich relevanten Ergebnisse in den ersten 10, 50 bzw. 100 abgerufenen Elementen erscheinen. Die Rückrufquote wird auf einer Skala von 0 bis 1 (oder 0 % bis 100 % Präzision) ausgedrückt. Und das ist wichtig, weil wir über ungefähres KNN (ANN) und nicht über exaktes KNN sprechen, bei dem die Rückrufrate immer 1 (100 %) beträgt.</p><p>Für jeden Wert von <em>k</em> haben wir auch <em>n angegeben, </em>also die Anzahl der Kandidaten, die vor der endgültigen Rangfolge berücksichtigt wurden. Dies bedeutet, dass das System für Recall@10, Recall@50 und Recall@100 zunächst <em>n</em> Kandidaten mithilfe des binären Quantisierungsalgorithmus abruft und sie dann in eine Rangfolge bringt, um zu bestimmen, ob die obersten <em>k</em> Ergebnisse die erwarteten relevanten Elemente enthalten.</p><p>Durch die Steuerung <em>von n</em> können wir den Kompromiss zwischen Effizienz und Genauigkeit analysieren. Ein höherer <em>n-Wert</em> <strong>erhöht</strong> normalerweise die Rückrufquote, da mehr Kandidaten für die Rangfolge zur Verfügung stehen, <strong>erhöht</strong> aber auch die Latenz und<strong> verringert </strong>den Durchsatz. Umgekehrt beschleunigt ein niedrigerer <em>n-</em> Wert zwar die Abfrage, kann aber die Trefferquote verringern, wenn zu wenige relevante Kandidaten im anfänglichen Satz enthalten sind.</p><p>In diesem Vergleich zeigte Elasticsearch bei identischen Setups eine geringere Latenz und einen höheren Durchsatz als OpenSearch.</p><h2>Methodik</h2><p>Die vollständige Konfiguration sowie Terraform-Skripte, Kubernetes-Manifeste und der spezifische Rally-Track sind in diesem <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq">Repository</a> unter <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> verfügbar.</p><p>Wie bei vorherigen Benchmarks haben wir einen Kubernetes-Cluster verwendet, der aus Folgendem besteht:</p><ul><li><p>1 Knotenpool für Elasticsearch 9.0 mit 3 <code>e2-standard-32</code> Maschinen (128 GB RAM und 32 CPUs)</p></li><li><p>1 Knotenpool für OpenSearch 2.19 mit 3 <code>e2-standard-32</code> Maschinen (128 GB RAM und 32 CPUs)</p></li><li><p>1 Knotenpool für Rally mit 2 <code>e2-standard-4</code> Maschinen (16 GB RAM und 4 CPUs)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt934e988e96a5849f/6a1709bbacf08838f9be9ac1/169bb6033f6eebfd1b177b3446bf916fde4ee5c5-1600x856.png" alt="Elasticsearch BBQ vs Opensearch FAISS Methodik-Setup" /><p>Wir haben einen Elasticsearch-Cluster Version 9.0 und einen OpenSearch-Cluster Version 2.19 eingerichtet.</p><p>Sowohl Elasticsearch als auch OpenSearch wurden mit genau demselben Setup getestet: Wir haben <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> Rally Track mit <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/commit/b97d5d95c22c8cf862f2030964524bdd156a5da3">einigen Modifikationen</a> verwendet, das 2,5 Millionen Dokumente aus dem <a href="https://huggingface.co/datasets/BeIR/nq">NQ-Datensatz</a> verwendet, angereichert mit Einbettungen, die mit <a href="https://openai.com/blog/new-and-improved-embedding-model">dem Modell text-embedding-ada-002</a> von OpenAI generiert wurden.</p>{
  "source-file": "open_ai_corpus-initial-indexing.json.bz2",
  "document-count": 2580961,
  "compressed-bytes": 32076749416,
  "uncompressed-bytes": 90263571686
}<p>Die Ergebnisse berichten über die gemessene Latenz und den Durchsatz bei verschiedenen Rückrufstufen (Recall@10, Recall@50 und Recall@100) unter Verwendung von 8 gleichzeitigen Clients zur Durchführung von Suchvorgängen. Wir haben einen einzelnen Shard und keine Replikate verwendet.</p><p>Wir haben die folgenden Kombinationen von kn-rescore ausgeführt, zB 10-2000-2000 oder <em>k:10</em>, <em>n:2000</em> und <em>rescore:2000</em> würden die besten k (10) von n Kandidaten (2000) abrufen, indem ein Rescore auf 2000 Ergebnisse angewendet wird (was einem „Oversample-Faktor“ von 1 entspricht). Jede Suche wurde 10.000 Mal ausgeführt, mit 1.000 Suchvorgängen als Aufwärmphase:</p><p></p><p><u><strong>Rückruf@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>Rückruf@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>Rückruf@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>Um den Benchmark zu replizieren, sind in den Kubernetes-Manifesten für Rally-Elasticsearch und Rally-Opensearch alle relevanten Variablen in einer ConfigMap externalisiert, die <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-es-bq.yml">hier</a> (ES) und <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-os-bq.yml">hier</a> (OS) verfügbar ist. Der Parameter <em>search_ops</em> kann angepasst werden, um jede Kombination aus k, n und Rescore zu testen.</p><h3>OpenSearch Rally-Konfiguration</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>Opensearch-Indexkonfiguration</h3><p>Die Variablen aus der ConfigMap werden dann auf die Indexkonfiguration angewendet, einige Parameter bleiben unverändert. Die 1-Bit-Quantisierung in OpenSearch wird durch <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">Einstellen der Komprimierungsstufe auf „32x“</a> konfiguriert.</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>Elasticsearch Rally-Konfiguration</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>Elasticsearch-Indexkonfiguration</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>Ergebnisse</h2><p>Es gibt mehrere Möglichkeiten, die Ergebnisse zu interpretieren. Sowohl für die Latenz als auch für den Durchsatz haben wir auf jeder Rückrufebene ein vereinfachtes und ein detailliertes Diagramm erstellt. Es ist leicht, Unterschiede zu erkennen, wenn wir bei jeder Metrik das Prinzip „höher ist besser“ berücksichtigen. Allerdings ist die Latenz ein negativer Faktor (je niedriger, desto besser), während der Durchsatz ein positiver Faktor ist. Für die vereinfachten Diagramme haben wir <strong>(Rückruf / Latenz) * 10000 </strong>(einfach „Geschwindigkeit“ genannt) und<strong> Rückruf * Durchsatz</strong> verwendet. Beide Messwerte bedeuten also, dass mehr Geschwindigkeit und mehr Durchsatz besser sind. Lasst uns loslegen.</p><h3>Rückruf @ 10 - vereinfacht</h3><p>Bei dieser Rückrufebene ist Elasticsearch BBQ bis zu <strong>5-mal schneller </strong>(durchschnittlich 3,9-mal schneller) und hat im Durchschnitt <strong>einen 3,2-mal höheren Durchsatz</strong> als OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3de6b3460127a8ae/6a1709bcb339d55975769f6f/d580ad53e8974bd3aa75957c413a0136c4e465c5-1600x681.png" alt="Elasticsearch BBQ ist bis zu 5-mal schneller (durchschnittlich 3,9-mal schneller) und bietet im Durchschnitt einen 3,2-mal höheren Durchsatz als OpenSearch FAISS (Recall@10)." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd47045013cac5e9d/6a1709be0e2e49599a41a088/18edce667fe36ab95033264ef8df6f352dda2425-2044x866.png" alt="Elasticsearch BBQ ist bis zu 5-mal schneller (durchschnittlich 3,9-mal schneller) und bietet im Durchschnitt einen 3,2-mal höheren Durchsatz als OpenSearch FAISS." /><h4>Rückruf @ 10 - Detailliert</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ecb02d4a2967dbd/6a1709bf14b270c04fe3c5c6/a7459b87e679f4ad963d0e2f1685499b40f6f050-1600x799.png" alt="Detaillierter Vergleich der Latenzzeiten von `recall@10`: Elasticsearch BBQ vs. Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt182da309ad6cfd39/6a1709c166c4f99077f8bfd8/c6036f55a13377654d296eb3148c7199e1965475-1600x799.png" alt="Detaillierter Vergleich des Durchsatzes bei recall@10: Elasticsearch BBQ vs. Opensearch FAISS." /><p></p><p>Aufgabe</p><p>Latenz.Mittelwert</p><p>Durchsatz.Mittelwert</p><p>Durchschnittliche Rückrufzahl</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>Rückruf @ 50 - vereinfacht</h3><p>Bei diesem Rückrufniveau ist Elasticsearch BBQ <strong>bis zu 5x schneller</strong> (durchschnittlich 4,2x schneller) und hat durchschnittlich <strong>3,9x mehr Durchsatz</strong> als OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt486683f2c7a1d677/6a1709c2a6c2b995bde796a3/3189ffb330948b35854eeea9ae317d4846c14972-1600x681.png" alt="Recal @50 Vektorleistungsvergleich Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba830c6741784682/6a1709c4a292990627d00ff7/607383d674dcf0b8f94bfb1a450063f52fcbeb15-2060x876.png" alt="Elasticsearch BBQ ist bis zu 5-mal schneller (durchschnittlich 4,2-mal schneller) und bietet im Durchschnitt einen 3,9-mal höheren Durchsatz als OpenSearch FAISS." /><h4>Detaillierte Ergebnisse – Rückruf @ 50</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt821775e7f87e5ede/6a1709c6a6c2b90af3e796a7/ebfffe0b776aad31dd03d315cfbf5aa098b41226-1600x789.png" alt="Recall@50 Elasticsearch BBQ und Opensearch FAISS Latenzergebnisse" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4f47784ed1017c15/6a1709c7e8fbce0fbe39fbf5/ae20cf870a65c400a2112bbad62eb56e244f549a-1600x799.png" alt="Recall@50 Elasticsearch BBQ und Opensearch FAISS Durchsatzergebnisse" /><p></p><p>Aufgabe</p><p>Latenzmittelwert</p><p>Durchsatzmittelwert</p><p>Durchschnittliche Rückrufrate</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>Rückruf @ 100</h3><p>Bei dieser Rückrufebene ist Elasticsearch BBQ <strong>bis zu 5-mal schneller </strong>(durchschnittlich 4,6-mal schneller) und hat im Durchschnitt <strong>einen 3,9-mal höheren Durchsatz </strong>als OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt380eb9165343a7b3/6a1709c9acf0882669be9ac5/d3f29db64cbde9956de1fa3ae64a75f15141a2bb-1600x681.png" alt="Recall @100 Elasticsearch BBQ V Opensearch FAISS results" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt505ce8aa70898390/6a1709cb1949f73a37e7a9bb/10aff7f8c61fdac895b9ba9c5342baf239ba3ffc-2072x864.png" alt="Vergleich der Latenz- und Durchsatzleistung von Elasticsearch BBQ und Opensearch FAISS" /><h4>Detaillierte Ergebnisse – Rückruf @ 100</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2a73e29940e9d6b/6a1709cccf4f257615b2d138/8790fdf9512b850447f6875fb69969f6f1d4da5f-1600x799.png" alt="Detaillierte Latenzergebnisse – Recall @ 100 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c91ca21da03d96/6a1709ce0c4857d3fc01aa39/d47032fac6c288cd4eedd9f25001e417b2fa9d65-1600x787.png" alt="Detaillierte Durchsatzergebnisse - Recall @ 100 Elasticsearch BBQ vs Opensearch FAISS." /><p></p><p>Aufgabe</p><p>Latenz.Mittelwert</p><p>Durchsatz.Mittelwert</p><p>Durchschnittliche Rückrufzahl</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>Verbesserungen beim Grillen</h2><p>BBQ hat seit seiner Erstveröffentlichung eine lange Entwicklung durchgemacht. Zu Vergleichszwecken haben wir bei Elasticsearch 8.16 neben dem aktuellen einen Benchmark-Lauf von 8.16 eingefügt und können sehen, wie sich Rückruf und Latenz seitdem verbessert haben.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f1f7ae1bb425a3a/6a1709cf67045bde8e45c192/45a0acfe5985bff28ccada76ec4eca190fe65f72-1600x799.png" alt="Verbesserungen der Latenz und des Recall-Werts von Elasticsearch 9.0 BBQ im Vergleich zu Elasticsearch 8.16 BBQ" /><p>In Elasticsearch 8.18 und 9.0 haben wir den Kernalgorithmus zur Quantisierung der Vektoren neu geschrieben. BBQ war in 8.16 zwar gut, aber die neuesten Versionen sind sogar noch besser. Sie können <a href="https://www.elastic.co/de/search-labs/blog/optimized-scalar-quantization-elasticsearch">hier</a> und <a href="https://www.elastic.co/de/search-labs/blog/scalar-quantization-optimization">hier</a> darüber lesen. Kurz gesagt, jeder Vektor wird einzeln durch optimierte skalare Quantile quantisiert. Dadurch profitieren Benutzer von einer höheren Genauigkeit bei der Vektorsuche ohne Leistungseinbußen, wodurch die Vektorabfrage von Elasticsearch noch leistungsfähiger wird.</p><h2>Fazit</h2><p>In diesem Leistungsvergleich zwischen Elasticsearch BBQ und OpenSearch FAISS übertrifft Elasticsearch OpenSearch bei der Vektorsuche deutlich und erreicht über verschiedene Rückrufebenen hinweg durchschnittlich bis zu 5-mal schnellere Abfragegeschwindigkeiten und einen 3,9-mal höheren Durchsatz.</p><p>Zu den wichtigsten Ergebnissen gehören:</p><ul><li><p><strong>Recall@10</strong>: Elasticsearch BBQ ist bis zu 5x schneller (durchschnittlich 3,9x schneller) und hat im Durchschnitt einen 3,2x höheren Durchsatz als OpenSearch FAISS.</p></li><li><p><strong>Recall@50</strong>: Elasticsearch BBQ ist bis zu 5x schneller (durchschnittlich 4,2x schneller) und hat im Durchschnitt einen 3,9x höheren Durchsatz als OpenSearch FAISS.</p></li><li><p><strong>Recall@100</strong>: Elasticsearch BBQ ist bis zu 5x schneller (durchschnittlich 4,6x schneller) und hat im Durchschnitt einen 3,9x höheren Durchsatz als OpenSearch FAISS.</p></li></ul><p>Diese Ergebnisse unterstreichen die Effizienz- und Leistungsvorteile von Elasticsearch BBQ, insbesondere in hochdimensionalen Vektorsuchszenarien. Die in Elasticsearch 8.16 eingeführte Better Binary Quantization (BBQ)-Technik bietet eine erhebliche Speicherreduzierung (~95 %) bei gleichzeitiger Beibehaltung einer hohen Ranking-Qualität und ist daher eine hervorragende Wahl für groß angelegte Vektorsuchanwendungen.</p><p>Bei Elastic arbeiten wir unermüdlich an Innovationen, um Apache Lucene und Elasticsearch zu verbessern und die beste Vektordatenbank für Such- und Abrufanwendungsfälle bereitzustellen, einschließlich RAG (Retrieval Augmented Generation). Unsere <a href="https://www.elastic.co/de/search-labs/blog/optimized-scalar-quantization-elasticsearch">jüngsten Fortschritte</a> haben die Leistung erheblich gesteigert und die Vektorsuche schneller und platzsparender gemacht als zuvor, aufbauend auf den Vorteilen von Lucene 10. Dieser Blog ist ein weiteres Beispiel für diese 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[Vektordatenbank]]></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 vs. OpenSearch: Vergleich der Leistung bei der Vektorsuche]]></title>
    <description><![CDATA[Elasticsearch ist standardmäßig bei der Vektorsuche 2 bis 12 Mal schneller als OpenSearch]]></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">TLDR: Elasticsearch ist bis zu 12 Mal schneller</a> – Wir bei Elastic haben zahlreiche Anfragen aus unserer Community erhalten, um die Leistungsunterschiede zwischen Elasticsearch und OpenSearch zu klären, insbesondere im Realm der semantischen Suche/Vektorsuche. Daher haben wir diesen Leistungstest durchgeführt, um einen klaren, datengesteuerten Vergleich bereitzustellen – keine Mehrdeutigkeiten, nur einfache Fakten zur Information unserer Nutzer. Die Ergebnisse zeigen, dass <strong>Elasticsearch bei der Vektorsuche bis zu 12 Mal schneller ist</strong> als OpenSearch und daher weniger Rechenressourcen benötigt. Dies spiegelt das Bestreben von Elastic wider, Lucene als beste Vektordatenbank für Such- und Abruffälle zu konsolidieren.</p><p>Die Vektorsuche revolutioniert die Art und Weise, wie wir Ähnlichkeitssuchen durchführen, insbesondere in Bereichen wie KI und Machine Learning. Mit der zunehmenden Verbreitung von Vektoreinbettungsmodellen wird die Fähigkeit, Millionen von hochdimensionalen Vektoren effizient zu durchsuchen, immer wichtiger.</p><p>Bei der Energieversorgung von Vektordatenbanken haben Elastic und OpenSearch bemerkenswert unterschiedliche Ansätze gewählt. Elastic investierte stark in die Optimierung von Apache Lucene mit Elasticsearch, um sie zur erstklassigen Wahl für Vektorsuchanwendungen zu machen. Im Gegensatz dazu erweiterte OpenSearch seinen Fokus, indem es andere Implementierungen der Vektorsuche integriert und über den Rahmen von Lucene hinausgeht. Unser Fokus auf Lucene ist strategisch und ermöglicht es uns, in unserer Version von Elasticsearch hochintegrierten Support bereitzustellen, was zu einem erweiterten Funktionsumfang führt, bei dem jede Komponente die Fähigkeiten der anderen ergänzt und erweitert.</p><p>Dieser Blog bietet einen detaillierten Vergleich zwischen Elasticsearch 8.14 und OpenSearch 2.14, wobei verschiedene Konfigurationen und Vektor-Engines berücksichtigt werden. In dieser Leistungsanalyse hat sich Elasticsearch als die überlegene Plattform für Vektorsuchen erwiesen, und kommende <a href="https://www.elastic.co/search-labs/blog/vector-similarity-computations-ludicrous-speed">Features</a> werden die Unterschiede noch <a href="https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">deutlicher</a> machen. Als es gegen OpenSearch antrat, schnitt es in jedem Benchmark-Track hervorragend ab und <strong>bot im Durchschnitt eine 2 bis 12 Mal schnellere Leistung</strong>. Dies geschah in Szenarien mit unterschiedlichen Vektormengen und Dimensionen, einschließlich <code>so_vector</code> (2 Mio. Vektoren, 768D), <code>openai_vector</code> (2,5 Mio. Vektoren, 1536D) und <code>dense_vector</code> (10 Mio. Vektoren, 96D), die alle in <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance">diesem Repository</a> neben den Terraform-Skripten zum Bereitstellen der gesamten erforderlichen Infrastruktur in Google Cloud und Kubernetes-Manifesten für die Ausführung der Tests verfügbar sind.</p><p>Die in diesem Blog beschriebenen Ergebnisse ergänzen die Ergebnisse einer <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap">zuvor veröffentlichten und von Dritten validierten Studie</a>, die zeigt, dass Elasticsearch bei den gängigsten Suchanalyseoperationen um 40%–140% schneller ist als OpenSearch: bei Textabfrage, Sortierung, Bereich, Datumshistogramm und Begriffsfilterung. Jetzt können wir ein weiteres Unterscheidungsmerkmal hinzufügen: die Vektorsuche.</p><h2>Bis zu 12 Mal schneller einsatzbereit</h2><p>Unsere gezielten Benchmarks über die vier Vektordatensätze hinweg umfassten sowohl approximative kNN- als auch exakte kNN-Suchen, wobei unterschiedliche Größen, Dimensionen und Konfigurationen berücksichtigt wurden, was insgesamt <code>40.189.820</code> nicht zwischengespeicherte Suchanfragen ergab. Das Ergebnis: <strong>Elasticsearch ist bei der Vektorsuche bis zu 12 Mal schneller</strong> als OpenSearch und benötigt daher weniger Rechenressourcen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34b83c6eba3bcb6e/6a17d727dbb4ff18d6fb54fb/cdb26e91f085b90e9b12aeb8fee53b04d365ecae-1440x1156.webp" alt="p90-Durchschnitt" /><p>Abbildung 1: Gruppierte Aufgaben für ANN und exaktes kNN in verschiedenen Kombinationen in Elasticsearch und OpenSearch.</p><p>Die Gruppen wie <code>knn-10-100</code> bezeichnen eine kNN-Suche mit  und . Bei der HNSW-Vektorsuche bestimmt  die Anzahl der nächsten Nachbarn, die für einen Abfragevektor abgerufen werden sollen. Es wird angegeben, wie viele ähnliche Vektoren als Ergebnis gefunden werden sollen.  legt die Anzahl der Kandidatenvektoren fest, die in jedem Segment abgerufen werden sollen. Mehr Kandidaten können die Genauigkeit erhöhen, erfordern jedoch mehr Rechenressourcen.</p><p>Wir haben auch mit verschiedenen Quantisierungstechniken getestet und Engine-spezifische Optimierungen genutzt. Die detaillierten Ergebnisse für jeden Track und jede Aufgabe und Vektor-Engine sind unten verfügbar.</p><h2>Exaktes kNN und approximatives kNN</h2><p>Beim Umgang mit unterschiedlichen Daten und Anwendungsfällen variiert der richtige Ansatz für die Vektorsuche. In diesem Blog verwenden alle als <code>knn-*</code> angegebenen Aufgaben wie <code>knn-10-100</code> <strong>approximatives kNN</strong> und <code>script-score-*</code> beziehen sich auf <strong>exaktes kNN</strong>, aber was ist der Unterschied zwischen ihnen und warum ist das wichtig?</p><p>Im Wesentlichen ist bei der Verarbeitung umfangreicherer Datensätze die Methode des Approximativen K-Nearest-Neighbor (ANN) aufgrund ihrer überlegenen Skalierbarkeit die bevorzugte Methode. Für bescheidenere Datensätze, die möglicherweise einen Filterprozess erfordern, ist die exakte kNN-Methode ideal.</p><p>Exaktes kNN verwendet eine Brute-Force-Methode, die den Abstand zwischen einem Vektor und jedem anderen Vektor im Datensatz berechnet. Anschließend werden diese Abstände in eine Rangfolge gebracht, um die  nächsten Nachbarn zu finden. Diese Methode gewährleistet zwar eine exakte Übereinstimmung, leidet aber bei großen, hochdimensionalen Datensätzen unter Problemen der Skalierbarkeit. Es gibt jedoch viele Fälle, in denen exaktes kNN benötigt wird:</p><ul><li><p><strong>Neubewertung</strong>: In Szenarien mit lexikalischen oder semantischen Suchen, gefolgt von einer vektorbasierten Neubewertung, ist exaktes kNN unerlässlich. In einer Produktsuchmaschine können erste Suchergebnisse auf der Grundlage von Textabfragen (z. B. Schlüsselwörtern, Kategorien) gefiltert werden. Anschließend werden Vektoren, die mit den gefilterten Elementen verknüpft sind, für eine genauere Ähnlichkeitsbewertung verwendet.</p></li><li><p><strong>Personalisierung</strong>: Bei einer großen Anzahl von Nutzern, die jeweils durch eine relativ kleine Anzahl (z. B. 1 Million) unterschiedlicher Vektoren repräsentiert werden, wird die Sortierung des Indexes nach nutzerspezifischen Metadaten (z. B. user_id) und die Brute-Force-Bewertung mit Vektoren effizient. Dieser Ansatz ermöglicht personalisierte Empfehlungen oder die Bereitstellung von Inhalten basierend auf präzisen Vektorvergleichen, die auf die individuellen Nutzerpräferenzen zugeschnitten sind.</p></li></ul><p>Exaktes kNN stellt sicher, dass das endgültige Ranking und die Empfehlungen basierend auf der Vektorähnlichkeit präzise und auf die Nutzerpräferenzen zugeschnitten sind.</p><p>Approximatives kNN (oder ANN) verwendet hingegen Methoden, um die Datensuche schneller und effizienter als exaktes kNN zu gestalten, insbesondere in großen, hochdimensionalen Datensätzen. Anstelle eines Brute-Force-Ansatzes, der den genauen kürzesten Abstand zwischen einer Abfrage und allen Punkten misst, was zu Berechnungs- und Skalierungsproblemen führt, verwendet ANN bestimmte Techniken, um die Indizes und Dimensionen durchsuchbarer Vektoren im Datensatz effizient neu zu strukturieren. Dies kann zwar zu einer leichten Ungenauigkeit führen, erhöht jedoch die Geschwindigkeit des Suchvorgangs erheblich und macht ihn zu einer effektiven Alternative für den Umgang mit großen Datensätzen.</p><p>In diesem Blog verwenden alle als <code>knn-*</code> bezeichneten Aufgaben wie <code>knn-10-100</code> <strong>approximatives kNN</strong> und <code>script-score-*</code> beziehen sich auf <strong>exaktes kNN</strong>.</p><h2>Testmethodik</h2><p>Während Elasticsearch und OpenSearch hinsichtlich der API für BM25-Suchvorgänge ähnlich sind, da letzteres ein Fork von ersterem ist, trifft dies auf die Vektorsuche, die nach dem Fork eingeführt wurde, nicht zu. OpenSearch verfolgte einen anderen Ansatz als Elasticsearch in Bezug auf Algorithmen, indem es neben <code>lucene</code> zwei weitere Engines – <code>nmslib</code> und <code>faiss</code> – einführte, die jeweils über spezifische Konfigurationen und Einschränkungen verfügen (z. B. erlaubt <code>nmslib</code> in OpenSearch keine Filter, ein wesentliches Feature für viele Anwendungsfälle).</p><p>Alle drei Engines verwenden den Hierarchical Navigable Small World (HNSW)-Algorithmus, der effizient für die approximative Suche nach dem nächsten Nachbarn und besonders leistungsfähig beim Umgang mit hochdimensionalen Daten ist. Es ist wichtig zu beachten, dass <code>faiss</code> auch einen zweiten Algorithmus, <code>ivf</code>, unterstützt, aber da dafür ein Vortraining am Datensatz erforderlich ist, werden wir uns ausschließlich auf HNSW konzentrieren. Die Kernidee von HNSW besteht darin, die Daten in mehreren Schichten verbundener Graphen zu organisieren, wobei jede Schicht eine andere Granularität des Datensatzes darstellt. Das Suchen beginnt auf der obersten Ebene mit der gröbsten Ansicht und schreitet zu immer feineren Schichten fort, bis es die unterste Ebene erreicht.</p><p>Beide Suchmaschinen wurden unter identischen Bedingungen in einer kontrollierten Umgebung getestet, um faire Testbedingungen zu gewährleisten. Die angewandte Methode ähnelt <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap#testing-methodology">diesem zuvor veröffentlichten Leistungsvergleich</a>, mit dedizierten Node-Pools für Elasticsearch, OpenSearch und Rally. Das <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/main/terraform/main.tf">Terraform-Skript</a> ist (neben allen Quellen) verfügbar, um einen Kubernetes-Cluster mit Folgendem bereitzustellen:</p><ul><li><p>1 Node-Pool für Elasticsearch mit 3 <code>e2-standard-32</code>-Maschinen (128 GB RAM und 32 CPUs)</p></li><li><p>1 Node-Pool für OpenSearch mit 3 <code>e2-standard-32</code>-Maschinen (128 GB RAM und 32 CPUs)</p></li><li><p>1 Node-Pool für Rally mit 2 <code>t2a-standard-16</code> Maschinen (64 GB RAM und 16 CPUs)</p></li></ul><p>Jeder „Track“ (oder Test) wurde 10 Mal für jede Konfiguration ausgeführt, die unterschiedliche Engines, Konfigurationen und Vektortypen umfasste. Die Tracks haben Aufgaben, die sich je nach Track zwischen 1.000 und 10.000 Mal wiederholen. Wenn eine der Aufgaben in einem Track z. B. aufgrund einer Netzwerk-Zeitüberschreitung fehlschlug, wurden alle Aufgaben verworfen, sodass alle Ergebnisse Tracks darstellen, die ohne Probleme gestartet und beendet wurden. Alle Testergebnisse sind statistisch validiert, um sicherzustellen, dass Verbesserungen nicht zufällig sind.</p><h2>Detaillierte Ergebnisse</h2><p>Warum das 99. Perzentil und nicht die durchschnittliche Latenz vergleichen? Betrachten Sie ein hypothetisches Beispiel für die durchschnittlichen Hauspreise in einem bestimmten Viertel. Der Durchschnittspreis mag auf eine teure Gegend hindeuten, aber bei näherer Betrachtung stellt sich womöglich heraus, dass die meisten Häuser viel niedriger bewertet sind und nur einige wenige Luxusimmobilien den Durchschnittswert in die Höhe treiben. Dies verdeutlicht, dass der Durchschnittspreis das gesamte Spektrum der Hauswerte in der Gegend nicht unbedingt genau wiedergibt. Man kann das mit der Untersuchung von Reaktionszeiten vergleichen, bei denen der Durchschnittswert möglicherweise kritische Probleme verbirgt.</p><h4>Aufgaben</h4><ul><li><p>Approximatives kNN mit k:10, n:50</p></li><li><p>Approximatives kNN mit k:10, n:100</p></li><li><p>Approximatives kNN mit k:100, n:1000</p></li><li><p>Approximatives kNN mit k:10, n:50 und Keyword-Filtern</p></li><li><p>Approximatives kNN mit k:10, n:100 und Keyword-Filtern</p></li><li><p>Approximatives kNN mit k:100, n:1000 und Keyword-Filtern</p></li><li><p>Approximatives kNN mit k:10, n:100 in Verbindung mit Indizierung</p></li><li><p>Exaktes kNN (Skriptergebnis)</p></li></ul><h4>Vektor-Engines</h4><ul><li><p><code>lucene</code> in Elasticsearch und OpenSearch, beide in Version 9.10</p></li><li><p><code>faiss</code> in OpenSearch</p></li><li><p><code>nmslib</code> in OpenSearch</p></li></ul><h4>Vektortypen</h4><ul><li><p><code>hnsw</code> in Elasticsearch und OpenSearch</p></li><li><p><code>int8_hnsw</code> in Elasticsearch (HNSW mit automatischer 8-Bit-Quantisierung: <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">Link</a>)</p></li><li><p><code>sq_fp16 hnsw </code>in OpenSearch (HNSW mit automatischer 16-Bit-Quantisierung: <a href="https://opensearch.org/docs/2.14/search-plugins/knn/knn-vector-quantization#faiss-16-bit-scalar-quantization">Link</a>)</p></li></ul><h4>Vorkonfigurierte und gleichzeitige Segmentsuche</h4><p>Wie Sie wahrscheinlich wissen, ist Lucene eine hochleistungsfähige Text-Suchmaschinen-Bibliothek, die in Java geschrieben wurde und als Rückgrat für viele Suchplattformen wie Elasticsearch, OpenSearch und Solr dient. Im Kern organisiert Lucene Daten in Segmente, die im Wesentlichen in sich geschlossene Indizes sind, mit denen Lucene Suchvorgänge effizienter ausführen kann. Wenn Sie also eine auf Lucene basierende Suchmaschine mit einer Suche beauftragen, wird Ihre Suche in diesen Segmenten entweder sequentiell oder parallel ausgeführt.</p><p>OpenSearch hat die gleichzeitige Segmentsuche als optionales Flag eingeführt und verwendet sie standardmäßig nicht. Sie müssen sie mit einer speziellen Indexeinstellung <code>index.search.concurrent_segment_search.enabled</code>, wie <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/">hier</a> beschrieben, aktivieren und es gibt einige <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/#other-considerations">Einschränkungen</a>.</p><p>Elasticsearch hingegen sucht <a href="https://github.com/elastic/elasticsearch/pull/101230">standardmäßig</a> gleichzeitig in Segmenten, daher berücksichtigen die Vergleiche, die wir in diesem Blog anstellen, neben den verschiedenen Vektor-Engines und Vektortypen auch die unterschiedlichen Konfigurationen:</p><ul><li><p>Elasticsearch ootb: Elasticsearch sofort einsatzbereit, mit gleichzeitiger Segmentsuche;</p></li><li><p>OpenSearch ootb: ohne aktivierte gleichzeitige Segmentsuche;</p></li><li><p>OpenSearch css: mit aktivierter gleichzeitiger Segmentsuche</p></li></ul><p>Kommen wir nun zu einigen detaillierten Ergebnissen für jeden getesteten Vektordatensatz:</p><h2>2,5 Millionen Vektoren, 1536 Dimensionen (openai_vector)</h2><p>Beginnen wir mit dem einfachsten, aber hinsichtlich der Dimensionen auch größten Track, <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> – er verwendet den <a href="https://huggingface.co/datasets/BeIR/nq">NQ-Datensatz</a>, der mit Einbettungen angereichert ist, die mit <a href="https://openai.com/blog/new-and-improved-embedding-model">dem Modell „text-embedding-ada-002“</a> von OpenAI generiert wurden. Dieser Track ist der einfachste, da er nur approximatives kNN testet und nur 5 Aufgaben hat. Er testet sowohl im Standalone-Modus (ohne Indizierung) als auch parallel zur Indizierung und verwendet sowohl einen einzelnen Client als auch 8 gleichzeitige Clients.</p><h3>Aufgaben</h3><ul><li><p><strong>standalone-search-knn-10-100-multiple-clients</strong>: Suche in 2,5 Millionen Vektoren mit 8 Clients gleichzeitig, k:10 und n:100</p></li><li><p><strong>standalone-search-knn-100-1000-multiple-clients</strong>: Suche in 2,5 Millionen Vektoren mit 8 Clients gleichzeitig, k:100 und n:1000</p></li><li><p><strong>standalone-search-knn-10-100-single-client</strong>: Suche in 2,5 Millionen Vektoren mit einem einzigen Client, k:10 und n:100</p></li><li><p><strong>standalone-search-knn-100-1000-single-client</strong>: Suche in 2,5 Millionen Vektoren mit einem einzigen Client, k:100 und n:1000</p></li><li><p><strong>parallel-documents-indexing-search-knn-10-100</strong>: Suche in 2,5 Millionen Vektoren bei gleichzeitigem Indexieren von weiteren 100.000 Dokumenten, k:10 und n:100</p></li></ul><p>Die durchschnittliche p99-Leistung ist unten aufgeführt:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5791848eb0c12fb/6a17d72925daab9cae08a09e/eea0b2b49c690baada3e09d6968e513bfffe51a9-1440x318.webp" alt="openai_vector-Tabelle" /><p>Hier haben wir beobachtet, dass Elasticsearch zwischen <strong>3 und 8 Mal schneller</strong> ist als OpenSearch, wenn es neben dem Indexieren auch eine Vektorsuche (d. h. Lesen und Schreiben) mit :10 und :100 durchführt, und ohne Indizierung für denselben k- und n-Wert <strong>2 bis 3 Mal schneller</strong> ist. Bei :100 und :1000 (<em>standalone-search-knn-100-1000-single-client</em> und <em>standalone-search-knn-100-1000-multiple-clients</em>) ist Elasticsearch im Durchschnitt <strong>2 bis 7 Mal</strong> schneller als OpenSearch.</p><p>Die detaillierten Ergebnisse zeigen die exakten Tickets und Vektor-Engines im Vergleich:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbe41d3187ced7ec/6a17d72a445de951c44cff4c/a7a761ed631d3e6211beb83d9d93d752d10123c9-1440x1728.webp" alt="openai_vector" /><h4>Recall</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 Millionen Vektoren, 96 Dimensionen (dense_vector)</h2><p>In <a href="https://github.com/elastic/rally-tracks/tree/master/dense_vector">dense_vector</a> mit 10 Millionen Vektoren und 96 Dimensionen. Dies basiert auf dem Bilddatensatz <a href="https://big-ann-benchmarks.com/">DEEP1B von Yandex</a>. Der Datensatz wird aus den ersten 10 Millionen Vektoren der „Beispieldaten“-Datei mit dem Namen <code>learn.350M.fbin</code> erstellt. Die Suchvorgänge verwenden Vektoren aus der Abfrage der Datei „Abfragedaten“<code>public.10K.fbin</code>.</p><p>Sowohl Elasticsearch als auch OpenSearch funktionieren bei diesen Daten sehr gut, insbesondere nach einer <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html">erzwungenen Zusammenführung</a>, die normalerweise bei schreibgeschützten Indizes durchgeführt wird und der Defragmentierung des Index ähnelt, um eine einzige „Tabelle“ zu haben, in der gesucht werden kann.</p><h3>Aufgaben</h3><p>Jede Aufgabe wird mit 100 Anfragen aufgewärmt und dann werden 1000 Anfragen gemessen</p><ul><li><p><strong>knn-search-10-100</strong>: Suche in 10 Millionen Vektoren, k:10 und n:100</p></li><li><p><strong>knn-search-100-1000</strong>: Suche in 10 Millionen Vektoren, k:100 und n:1000</p></li><li><p><strong>knn-search-10-100-force-merge</strong>: Suche in 10 Millionen Vektoren nach einer erzwungenen Zusammenführung, k:10 und n:100</p></li><li><p><strong>knn-search-100-1000-force-merge</strong>: Suche in 10 Millionen Vektoren nach einer erzwungenen Zusammenführung, k:100 und n:1000</p></li><li><p><strong>knn-search-100-1000-concurrent-with-indexing</strong>: Suche in 10 Millionen Vektoren bei gleichzeitiger Aktualisierung <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/challenges/default.json#L76C36-L76C37">von 5 % des Datensatzes</a>, k:100 und n:1000</p></li><li><p><strong>script-score-query</strong>: Exakte kNN-Suchen in <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/queries.json">2000 spezifischen Vektoren</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4629d06af85eb96c/6a17d72c6864a423e7b685dc/174995e0a2156d86359cdb7aa446dfaae6312ea4-1440x316.webp" alt="dense_vector" /><p>Sowohl Elasticsearch als auch OpenSearch haben sich bei der ANN-Suche gut bewährt. Wenn der Index in <em>knn-search-100-1000-force-merge</em> und <em>knn-search-10-100-force-merge</em> zusammengeführt wird (d. h. nur ein Segment hat), schneidet OpenSearch bei der Verwendung von <code>nmslib</code> und <code>faiss</code> besser ab als die anderen, obwohl sie alle um die 15 ms und dicht beieinander liegen.</p><p>Wenn der Index in <em>knn-search-10-100</em> und <em>knn-search-100-1000</em> jedoch mehrere Segmente hat (eine typische Situation, in der ein Index Aktualisierungen seiner Dokumente erhält), hält Elasticsearch die Latenz bei etwa ~7 ms und ~16 ms, während alle anderen OpenSearch-Engines langsamer sind.</p><p>Auch wenn der Index gleichzeitig gesucht und beschrieben wird (<em>knn-search-100-1000-concurrent-with-indexing</em>), hält Elasticsearch die Latenz unter 15 ms (bei 13,8 ms) und ist damit fast <strong>4 Mal schneller</strong> als OpenSearch im Standardmodus (49,3 ms) und auch dann noch schneller, wenn die gleichzeitige Segmentsuche aktiviert ist (17,9 ms). Dies ist aber zu nah, um von Bedeutung zu sein.</p><p>Bei exaktem kNN ist der Unterschied viel größer: Elasticsearch <strong>ist 6 Mal schneller</strong> als OpenSearch (~260 ms gegenüber ~1600 ms).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt254f43bcaa3dbfc2/6a17d72ddbb4ffc780fb54ff/17aec6be31117440bc4d1f99984aed95df1c4f6b-1440x1728.webp" alt="dense_vector" /><h4>Recall</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 Millionen Vektoren, 768 Dimensionen (so_vector)</h2><p>Dieser <a href="https://github.com/elastic/rally-tracks/tree/master/so_vector">Track</a>,<code>so_vector</code>, stammt aus einem <a href="https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z">Bündel von StackOverflow-Beiträgen, die</a> am 21. April 2022 heruntergeladen wurden. Er enthält nur Fragedokumente – alle Dokumente mit Antworten wurden entfernt. Jeder Fragentitel wurde mithilfe des Satztransformatormodells <a href="https://huggingface.co/sentence-transformers/multi-qa-mpnet-base-cos-v1">multi-qa-mpnet-base-cos-v1</a> in einen Vektor kodiert. Dieser Datensatz enthält die ersten 2 Millionen Fragen.</p><p>Im Gegensatz zum vorherigen Track enthält jedes Dokument hier neben Vektoren auch andere Felder, um Test-Features wie approximativer kNN mit Filterung und Hybridsuche zu unterstützen. <code>nmslib</code> für OpenSearch fehlt in diesem Test auffallend, da <a href="https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/#k-nn-search-with-filters">es keine Filter unterstützt</a>.</p><h3>Aufgaben</h3><p>Jede Aufgabe wird mit 100 Anfragen aufgewärmt und dann werden 100 Anfragen gemessen. Beachten Sie, dass die Aufgaben der Einfachheit halber gruppiert wurden, da der Test 16 Suchtypen mal 2 verschiedene k-Werte mal 3 verschiedene n-Werte enthält.</p><ul><li><p><strong>kNN-10-50</strong>: Suche in 2 Millionen Vektoren ohne Filter, k:10 und n:50</p></li><li><p><strong>knn-10-50-filtered</strong>: Suche in 2 Millionen Vektoren <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">mit Filtern</a>, k:10 und n:50</p></li><li><p><strong>knn-10-50-after-force-merge</strong>: Suche in 2 Millionen Vektoren mit Filtern und nach einer erzwungenen Zusammenführung, k:10 und n:50</p></li><li><p><strong>knn-10-100</strong>: Suche in 2 Millionen Vektoren ohne Filter, k:10 und n:100</p></li><li><p><strong>knn-10-100-filtered</strong>: Suche in 2 Millionen Vektoren <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">mit Filtern</a>, k:10 und n:100</p></li><li><p><strong>knn-10-100-after-force-merge</strong>: Suche in 2 Millionen Vektoren mit Filtern und nach einer erzwungenen Zusammenführung, k:10 und n:100</p></li><li><p><strong>knn-100-1000</strong>: Suche in 2 Millionen Vektoren ohne Filter, k:100 und n:1000</p></li><li><p><strong>knn-100-1000-filtered</strong>: Suche in 2 Millionen Vektoren <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">mit Filtern</a>, k:100 und n:1000</p></li><li><p><strong>knn-100-1000-after-force-merge</strong>: Suche in 2 Millionen Vektoren mit Filtern und nach einer erzwungenen Zusammenführung, k:100 und n:1000</p></li><li><p><strong>exact-knn</strong>: Exakte KNN-Suche <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json#L56">mit und ohne Filter</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b44e1306af35877/6a17d72f577262aca11bca3e/d4ed2982d55370cad4b2048b23ce97caa55017c0-1440x316.webp" alt="so_vector-Tabelle" /><p>Elasticsearch ist in diesem Test <strong>durchweg schneller</strong> als OpenSearch, nur in zwei Fällen ist OpenSearch schneller, jedoch nicht viel (<em>knn-10-100</em> und <em>knn-100-1000</em>). Aufgaben mit <em>knn-10-50</em>, <em>knn-10-100</em> und <em>knn-100-1000</em> in Kombination mit Filtern zeigen einen Unterschied von bis zu dem <strong>Siebenfachen</strong> (112 ms vs. 803 ms).</p><p>Die Leistung beider Lösungen scheint sich nach einem „force-merge“ verständlicherweise anzugleichen, wie <em>knn-10-50-after-force-merge</em>, <em>knn-10-100-after-force-merge</em> und <em>knn-100-1000-after-force-merge</em> zeigen. Bei diesen Aufgaben ist <code>faiss</code> schneller.</p><p>Die Leistung beim exakten kNN ist erneut sehr unterschiedlich, wobei Elasticsearch diesmal <strong>13 Mal schneller</strong> ist als OpenSearch (~385 ms vs. ~5262 ms).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf80ccc7c2df84559/6a17d7314b055de00d43203f/615cb9228eb05ddd2e9512b3a6a5bc88d4088a1a-1440x1440.webp" alt="so_vector" /><h4>Recall</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 und Lucene als klare Sieger</h2><p>Bei Elastic entwickeln wir Apache Lucene und Elasticsearch ständig weiter, um sicherzustellen, dass wir die führende Vektordatenbank für Such- und Abrufanwendungsfälle bereitstellen können, einschließlich RAG (Retrieval-Augmented Generation). Unsere jüngsten Fortschritte haben die Leistung drastisch gesteigert und, aufbauend auf den Vorteilen von Lucene 9.10, die Vektorsuche noch <a href="https://search-labs.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">schneller und platzsparender</a> gemacht. In diesem Blog wurde eine Studie vorgestellt, die zeigt, dass Elasticsearch beim Vergleich aktueller Versionen bis zu 12 Mal schneller ist als OpenSearch.</p><p>Es ist erwähnenswert, dass beide Produkte dieselbe Version von Lucene verwenden (<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-8.14.0.html">Versionshinweise zu Elasticsearch 8.14</a> und <a href="https://github.com/opensearch-project/OpenSearch/blob/2.14/release-notes/opensearch.release-notes-2.14.0.md">zu OpenSearch 2.14</a>).</p><p>Das Innovationstempo bei Elastic wird nicht nur für unsere On-Prem- und Elastic Cloud-Kunden, sondern auch für diejenigen, die unsere <a href="https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">zustandslose Plattform</a> nutzen, noch mehr bieten. Features wie die Unterstützung der <a href="https://www.elastic.co/search-labs/blog/int4-scalar-quantization-in-lucene">skalaren Quantisierung auf int4</a> werden mit strengen Tests angeboten, um sicherzustellen, dass Kunden diese Techniken ohne signifikanten Rückgang der Abrufe nutzen können, ähnlich wie <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">bei unseren Tests für int8</a>.</p><p>Die Effizienz der Vektorsuche wird aufgrund der Verbreitung von KI- und Machine Learning-Anwendungen allmählich zu einem unverzichtbaren Feature in modernen Suchmaschinen. Für Unternehmen, die nach einer leistungsstarken Suchmaschine suchen, die in der Lage ist, mit den Anforderungen an großvolumige, hochkomplexe Vektordaten Schritt zu halten, ist Elasticsearch die definitive Antwort.</p><p>Egal, ob Sie eine etablierte Plattform erweitern oder neue Projekte initiieren – die Integration von Elasticsearch für Vektorsuchen ist ein strategischer Schritt, der greifbare, langfristige Vorteile bringen wird. Mit seinem nachgewiesenen Leistungsvorteil ist Elasticsearch bereit, die nächste Welle von Innovationen im Bereich des Suchens zu unterstützen.</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[Vektordatenbank]]></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>