<?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[Sachin Frayne - 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[Sachin Frayne - 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/sachin-frayne</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/author/sachin-frayne</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/author/sachin-frayne.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Fri, 11 Sep 2026 20:30:18 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Die Vektorsuche in Elasticsearch ist bis zu 8-mal schneller als in OpenSearch]]></title>
    <description><![CDATA[Analyse von Benchmarks zum gefilterten Vektorsuchen: OpenSearch und Elasticsearch im Vergleich – und warum die Performance des Vektorsuchens für kontextoptimierte Systeme entscheidend ist.]]></description>
    <content:encoded><![CDATA[<h2>Warum die Suchgeschwindigkeit für KI-Agenten und Kontext-Engineering wichtig ist</h2><p>Unsere Benchmarks auf einem 20-Millionen-Dokumentenkorpus zeigen, dass Elasticsearch bei der gefilterten Vektorsuche bis zu 8-mal mehr Durchsatz als OpenSearch liefert und gleichzeitig höhere Recall@100 in den getesteten Konfigurationen erzielt. Kontextgestaltung erfordert mehr als nur einen schnellen Vektorabruf. Teams benötigen außerdem starke Relevanzkontrollen, wie hybride Such- und Filterfunktionen, eine einfache Bedienung und eine vorhersehbare Leistung bei der Iteration von Workflows. Da die Agenten jedoch oft mehrmals pro Anfrage Abfrage-, Auswertungs- und erneute Abfrage-Schleifen durchlaufen, wirkt sich die Latenz bei der Datenabfrage multiplikativ aus, sodass Verbesserungen in diesem Bereich direkt zu einer besseren Reaktionsgeschwindigkeit über den gesamten Prozess hinweg und zu geringeren Kosten führen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9daec868eed84658/6a170bef6234e0c322db1a19/d5a52a07773f0942c2baa732dacfe782aac0f415-1600x683.png" alt="OpenSearch und Elasticsearch im Vergleich: Durchsatz für den Benchmark der gefilterten Vektorsuche" /><p>Für das Kontext-Engineering ist der Abruf kein einmaliger Schritt. Agenten und Anwendungen führen wiederholt Schleifen aus, wie z. B. Abrufen → Begründung → Abrufen, um Abfragen zu verfeinern, Fakten zu überprüfen, einen fundierten Kontext zusammenzustellen und Aufgaben zu erledigen. Dieses Muster ist typisch für agentenbasierte Workflows und iterative Retrieval Augmented Generation (RAG). Da der Abruf pro Nutzeranfrage mehrfach aufgerufen werden kann, verzögert sich die Reaktion und/oder erhöht die Infrastrukturkosten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt718c72fb858e4c98/6a170bf00e2e496e7241a132/54ac476ff20a3cf93484298c9ae47612c12fc110-800x417.png" alt="Kontext-Engineering wandelt einen großen Kontextpool in ein begrenztes LLM-Kontextfenster um." /><h2>Warum ist die Leistung der Vektorsuche so wichtig?</h2><p></p><p>Stellen Sie sich vor, ein Verkäufer beantwortet die Frage: „Ich brauche einen Handgepäck-Rucksack unter 60 €, in den ein 15-Zoll-Laptop passt, der wasserabweisend ist und bis Freitag geliefert werden kann.“</p><p>In der Produktion gibt der Assistent nur selten eine Vektorabfrage aus und hält dann an. Es führt einen Abrufzyklus aus, um den richtigen Kontext aufzubauen, und jeder Schritt wird typischerweise durch Filter eingeschränkt, wie Verfügbarkeit, Region, Versandversprechen, Markenregeln und Richtlinienberechtigung.</p><p><strong>Schritt 1: Absicht interpretieren und in Einschränkungen übersetzen.</strong></p><p>Der Agent wandelt die Anfrage in strukturierte Filter und eine semantische Abfrage um, wie zum Beispiel:</p><ul><li><p>Filterkriterien: Auf Lager, lieferbar an die Postleitzahl des Nutzers, Lieferung bis Freitag, Preis unter 60 €, gültiges Angebot</p></li><li><p>Vektorabfrage: „Bordrucksack für 15-Zoll-Laptop, wasserabweisend“</p></li></ul><p><strong>Schritt 2: Kandidaten abrufen und anschließend verfeinern.</strong></p><p>Es wiederholt oft das Abrufen mit Variationen, um gute Übereinstimmungen nicht zu verpassen:</p><ul><li><p>„Reiserucksack in Kabinengröße mit Laptophülle“</p></li><li><p>„wasserabweisender Pendlerrucksack 15 Zoll“</p></li><li><p>„ leichtgewichtiger Kabinenrucksack “</p></li></ul><p>Für jede Abfrage werden die gleichen Berechtigungsfilter verwendet, da das Abrufen irrelevanter oder nicht verfügbarer Elemente eine Verschwendung von Kontext darstellt.</p><p><strong>Schritt 3: Erweitern, um Details zu bestätigen und das Risiko zu reduzieren.</strong></p><p>Der Agent ruft dann erneut ab, um wichtige Attribute zu überprüfen, die die endgültige Antwort beeinflussen:</p><ul><li><p>Angaben zu Material und Wasserfestigkeit</p></li><li><p>Abmessungen und Passform des Laptopfachs</p></li><li><p>Rückgabebestimmungen oder Garantiebeschränkungen</p></li><li><p>Alternative Optionen, wenn der Bestand gering ist</p></li></ul><p>Dies ist mehrstufiges Kontext-Engineering: Abrufen, schlussfolgern, abrufen, zusammenstellen.</p><h2>Warum Latenz und Recall für das Kontext-Engineering wichtig sind</h2><p>Diese Interaktionen können Dutzende gefilterter Abrufaufrufe pro Nutzersitzung umfassen. Das macht die Latenz pro Anruf zu einem direkten Multiplikator der End-to-End-Reaktionszeit, und eine niedrige Rückrufrate erzwingt zusätzliche Wiederholungsversuche oder führt dazu, dass der Agent geeignete Elemente übersieht, was die Antwortqualität verschlechtert.</p><p>Fazit: In kontextbasierten Systemen ist die gefilterte approximative Suche nach nächsten Nachbarn (ANN) keine einfache Nachschlageoperation. Sie ist ein wiederholter Vorgang unter Einschränkungen, sodass die Leistung der Vektorsuche sofort in Latenz, Durchsatz und Kosten angezeigt wird, selbst wenn das Large Language Model (LLM) die sichtbarste Komponente ist.</p><h2>Benchmarking</h2><h3>Ergebnisse</h3><p>In Diagramm 2 stellt jeder Punkt eine Testkonfiguration dar. Die besten Ergebnisse werden oben links angezeigt, was eine höhere Erinnerungsrate bei geringerer Latenz bedeutet. Die Ergebnisse von Elasticsearch liegen durchweg näher am oberen linken Rand als die von OpenSearch, was auf eine höhere Geschwindigkeit und Genauigkeit bei gleicher Arbeitslast hinweist.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb562b30a600cc8e1/6a170bf2cf4f253582b2d1b2/c50d1df00968cac18149a2799e6242fbe49b66a0-1600x990.png" alt=" Diagramm 2: Erinnerungsleistung und durchschnittliche Latenz im Vergleich (Neubewertung 1)." /><h4>Einige wichtige Einblicke</h4><ul><li><p><code>s_n_r_value</code>: Kurzschrift für <code>size_numCandidates_rescoreOversample</code> (k und numCandidates in diesen Tests gleich numCandidates gesetzt), zum Beispiel <code>100_500_1</code> bedeutet size=100, numCandidates=500 und k=500, rescore oversample=1</p></li><li><p>Erinnerung: Gemessener Recall@100 für diese Konfiguration</p></li><li><p>Durchschnittslatenz (ms): Durchschnittliche End-to-End-Latenz pro Abfrage</p></li><li><p>Durchsatz: Abfragen pro Sekunde</p></li><li><p>Erinnerung %: Relative Verbesserung der Trefferquote von Elasticsearch gegenüber OpenSearch (Elasticsearch minus OpenSearch) / OpenSearch</p></li><li><p>Latenz Xs: Die durchschnittliche Latenz von OpenSearch dividiert durch die durchschnittliche Latenz von Elasticsearch</p></li><li><p>Durchsatz Xs: Elasticsearch-Durchsatz geteilt durch den OpenSearch-Durchsatz</p></li></ul><p>Engine</p><p>`s_n_r_value`</p><p>Abruf</p><p>Durchschnittliche Latenz (ms)</p><p>Durchsatz</p><p>Erinnerung %</p><p>Latenz Xs</p><p>Durchsatz Xs</p><p>Elasticsearch</p><p>100_250_1</p><p>0,7704</p><p>25</p><p>534,75</p><p>9,70 %</p><p>2,28</p><p>1,91</p><p>OpenSearch</p><p>100_250_1</p><p>0,7023</p><p>57,08</p><p>279,58</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_500_1</p><p>0,8577</p><p>25,42</p><p>524,14</p><p>7,20 %</p><p>2,4</p><p>2</p><p>OpenSearch</p><p>100_500_1</p><p>0,8001</p><p>60,9</p><p>262,12</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_750_1</p><p>0,8947</p><p>29,67</p><p>528,09</p><p>5,72 %</p><p>2,25</p><p>2,21</p><p>OpenSearch</p><p>100_750_1</p><p>0,8463</p><p>66,76</p><p>239,11</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_1000_1</p><p>0,9156</p><p>29,65</p><p>534,5</p><p>4,66 %</p><p>2,46</p><p>2,44</p><p>OpenSearch</p><p>100_1000_1</p><p>0,8748</p><p>72,88</p><p>219,01</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_1500_1</p><p>0,9386</p><p>31,84</p><p>497,3</p><p>3,38 %</p><p>2,71</p><p>2,68</p><p>OpenSearch</p><p>100_1500_1</p><p>0,9079</p><p>86,16</p><p>185,4</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_2000_1</p><p>0,9507</p><p>34,69</p><p>457,2</p><p>2,57 %</p><p>2,98</p><p>2,96</p><p>OpenSearch</p><p>100_2000_1</p><p>0,9269</p><p>103,36</p><p>154,55</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_2500_1</p><p>0,9582</p><p>37,9</p><p>418,43</p><p>1,99 %</p><p>3,28</p><p>3,26</p><p>OpenSearch</p><p>100_2500_1</p><p>0,9395</p><p>124,29</p><p>128,53</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_3000_1</p><p>0,9636</p><p>41,86</p><p>379,4</p><p>1,62 %</p><p>3,46</p><p>3,44</p><p>OpenSearch</p><p>100_3000_1</p><p>0,9482</p><p>144,67</p><p>110,34</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_4000_1</p><p>0,9705</p><p>50,28</p><p>316,21</p><p>1,06 %</p><p>3,87</p><p>3,85</p><p>OpenSearch</p><p>100_4000_1</p><p>0,9603</p><p>194,36</p><p>82,22</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_5000_1</p><p>0,9749</p><p>58,77</p><p>270,91</p><p>0,73 %</p><p>4,43</p><p>4,41</p><p>OpenSearch</p><p>100_5000_1</p><p>0,9678</p><p>260,33</p><p>61,38</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_6000_1</p><p>0,9781</p><p>66,75</p><p>238,59</p><p>0,52 %</p><p>4,91</p><p>4,89</p><p>OpenSearch</p><p>100_6000_1</p><p>0,973</p><p>327,44</p><p>48,81</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_7000_1</p><p>0,9804</p><p>74,64</p><p>213,49</p><p>0,38 %</p><p>5,28</p><p>5,27</p><p>OpenSearch</p><p>100_7000_1</p><p>0,9767</p><p>394,24</p><p>40,53</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_8000_1</p><p>0,9823</p><p>82,28</p><p>193,59</p><p>0,27 %</p><p>6,86</p><p>6,83</p><p>OpenSearch</p><p>100_8000_1</p><p>0,9797</p><p>564,14</p><p>28,33</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_9000_1</p><p>0,9837</p><p>90,08</p><p>176,96</p><p>0,16 %</p><p>7,63</p><p>7,61</p><p>OpenSearch</p><p>100_9000_1</p><p>0,9821</p><p>687,25</p><p>23,25</p><p></p><p></p><p></p><p>Elasticsearch</p><p>100_10000_1</p><p>0,9848</p><p>97,64</p><p>163,31</p><p>0,08 %</p><p>8,38</p><p>8,36</p><p>OpenSearch</p><p>100_10000_1</p><p>0,984</p><p>818,64</p><p>19,53</p><p></p><p></p><p></p><p>Zum Beispiel beträgt OpenSearch bei <code>100_9000_1</code> im Durchschnitt 687 Millisekunden pro Abruf gegenüber 90 Millisekunden bei Elasticsearch, und in einer 10-Schritte-Abrufschleife entspricht das etwa 10 × (687 - 90) = sechs Sekunden zusätzlicher Wartezeit. </p><p><a href="https://github.com/elastic/competitive-benchmarking-studies/tree/main/es-9.3-vs-os-3.5-vector-search/jingra/results/20260220">Die vollständigen Ergebnisse</a> ansehen.</p><h3>Methodik</h3><p>Wir verwendeten Python, um die Anfragen zu senden und die Antwortzeiten sowie weitere Statistiken zu verfolgen. Wir haben die folgenden Anfragen an die Engines gesendet. Bedenken Sie, dass die Leistungsfähigkeit jeder Vektorsuchmaschine davon abhängt, wie Sie ihre Kernparameter einstellen: wie viele Kandidaten berücksichtigt werden sollen, wie aggressiv die Neubewertung erfolgen soll und wie viel Kontext zurückgegeben werden soll. Diese Einstellungen wirken sich direkt sowohl auf die Trefferquote (die Wahrscheinlichkeit, die richtige Antwort zu finden) als auch auf die Latenz (wie schnell Sie Ergebnisse erzielen) aus.</p><p>In unseren Benchmarks verwendeten wir die gleichen Kandidaten-, Rescore- und Ergebnisgrößeneinstellungen, die man typischerweise in einer agentenbasierten Abrufschleife anpasst, und wir maßen, wie Elasticsearch unter dieser Arbeitslast abschneidet. Anschließend führten wir OpenSearch mit denselben Einstellungen als Referenz durch.</p><p>OpenSearch</p>GET &lt;INDEX_NAME&gt;/_search
{
  "query": {
    "knn": {
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;": {
        "vector": [...],
        "k": &lt;NUMBER_OF_CANDIDATES&gt;,
        "method_parameters": {
          "ef_search": &lt;NUMBER_OF_CANDIDATES&gt;
        },
        "rescore": {
          "oversample_factor": &lt;OVERSAMPLE&gt;
        },
        "filter": {
          &lt;SOME_FILTER&gt;
        }
      }
    }
  },
  "size": &lt;RESULT_SIZE&gt;,
  "_source": {
    "excludes": [
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;"
    ]
  }
}<ul><li><p><code>"size": &lt;RESULT_SIZE&gt;</code>: Anzahl der an den Client zurückgegebenen Treffer. In diesem Benchmark ist die Ergebnisgröße 100, um Recall@100 zu berechnen.</p></li><li><p><code>"k": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Die Anzahl der nächstgelegenen Nachbarkandidaten.</p></li><li><p><code>"ef_search": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Die Anzahl der zu untersuchenden Vektoren.</p></li><li><p><code>"oversample_factor": &lt;OVERSAMPLE&gt;</code>: Wie viele Kandidatenvektoren werden abgerufen, bevor das Rescoring erfolgt.</p></li></ul><p>Elasticsearch</p>GET &lt;INDEX_NAME&gt;/_search
{
  "query": {
    "knn": {
      "field": "&lt;DENSE_VECTOR_FIELD_NAME&gt;",
      "query_vector": [...],
      "k": &lt;NUMBER_OF_CANDIDATES&gt;,
      "num_candidates": &lt;NUMBER_OF_CANDIDATES&gt;,
      "rescore_vector": {
        "oversample": &lt;OVERSAMPLE&gt;
      },
      "filter": {
        &lt;SOME_FILTER&gt;
      }
    }
  },
  "size": &lt;RESULT_SIZE&gt;,
  "_source": {
    "excludes": [
      "&lt;DENSE_VECTOR_FIELD_NAME&gt;"
    ]
  }
}<ul><li><p><code>"size": &lt;RESULT_SIZE&gt;</code>: Anzahl der an den Client zurückgegebenen Treffer. In diesem Benchmark ist die Ergebnisgröße 100, um Recall@100 zu berechnen.</p></li><li><p><code>"k": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Anzahl der nächsten Nachbarn, die von jedem Shard zurückgegeben werden sollen.</p></li><li><p><code>"num_candidates": &lt;NUMBER_OF_CANDIDATES&gt;</code>: Anzahl der zu berücksichtigenden nächsten Nachbarn pro Shard bei der <code>knn</code> -Suche.</p></li><li><p><code>"oversample": &lt;OVERSAMPLE&gt;</code>: Wie viele Kandidatenvektoren werden abgerufen, bevor das Rescoring erfolgt.</p></li></ul><p>Beispiel</p><p><code>Knn</code> Die Abfrage (<code>100_500_1</code>) würde wie folgt lauten:</p><p>OpenSearch</p>GET search_catalog_128/_search
{
  "query": {
    "knn": {
      "search_catalog_embedding": {
        "vector": [...],
        "k": 500,
        "method_parameters": {
          "ef_search": 500
        },
        "rescore": {
          "oversample_factor": 1
        },
        "filter": {
          "term": {
            "valid": true
          }
        }
      }
    }
  },
  "size": 100,
  "_source": {
    "excludes": [
      "search_catalog_embedding"
    ]
  }
}<p>Elasticsearch</p>GET search_catalog_128/_search
{
  "query": {
    "knn": {
      "field": "search_catalog_embedding",
      "query_vector": [...],
      "k": 500,
      "num_candidates": 500,
      "rescore_vector": {
        "oversample": 1
      },
      "filter": {
        "term": {
          "valid": true
        }
      }
    }
  },
  "size": 100,
  "_source": {
    "excludes": [
      "search_catalog_embedding"
    ]
  }
}<p>Die vollständige Konfiguration, zusammen mit Terraform-Skripten, Kubernetes-Manifesten und dem Benchmarking-Code, ist in diesem <a href="https://github.com/elastic/competitive-benchmarking-studies">Repository</a> im Ordner <a href="https://github.com/elastic/competitive-benchmarking-studies/tree/main/es-9.3-vs-os-3.5-vector-search">es-9.3-vs-os-3.5-vector-search</a> verfügbar.</p><h3>Cluster-Einrichtung</h3><p>Wir führten unsere Tests auf sechs e2-Standard-16-Cloud-Servern durch, jeder mit 16 vCPUs und 64 GB RAM. Auf jedem Server haben wir 15 vCPUs und 56 GB RAM jedem Kubernetes-Pod zugewiesen, der den Suchmaschinen-Node ausführt, wobei 28 GB für den JVM-Heap reserviert waren.</p><p>Die Cluster liefen mit Elasticsearch 9.3.0 und OpenSearch 3.5.0 (Lucene 10.3.2). Da beide Systeme in diesem Benchmark die gleiche Lucene-Version verwenden, können die beobachteten Unterschiede im Durchsatz und in der Latenz nicht allein Lucene zugeschrieben werden, sondern spiegeln vielmehr Unterschiede in der Art und Weise wider, wie die einzelnen Engines die gefilterte k-nächste-Nachbarn-Suche (kNN) und das Rescoring integrieren und ausführen. Wir haben einen einzelnen Index mit drei Primäre Shards und einem Replikat verwendet (also insgesamt 6 Shards, einer pro Node).</p><p>Wir verwendeten außerdem einen separaten Server in derselben Region, um den Benchmark-Client auszuführen und Zeitstatistiken zu erfassen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7c7bdd567395d5b7/6a170bf3c1e8a56ee2f882f6/f81002c9186e4c2d3e92f49d72418fee9860fc5e-761x401.png" alt="Clustering-Einrichtung für Elasticsearch und OpenSearch-Benchmarks" /><h3>Der Datensatz</h3><p></p><p>Für diesen Benchmark verwendeten wir einen umfangreichen Katalog-Embedding-Datensatz im E-Commerce-Stil mit 20 Millionen Dokumenten, der die reale gefilterte Vektorsuche in großem Umfang widerspiegeln soll.</p><p></p><p>Jedes Dokument stellt einen Katalogartikel dar und beinhaltet:</p><p></p><ul><li><p>Eine 128-dimensionale Dichtevektoreinbettung, die für das ungefähre kNN-Abrufverfahren verwendet wird.</p></li><li><p>Strukturierte Metadatenfelder, die zur Filterung verwendet werden (zum Beispiel die Gültigkeit und Verfügbarkeit von Artikeln sowie andere Katalogbeschränkungen), die das gemeinsame Produktionsmuster ermöglichen, die nächstgelegenen Nachbarn abzurufen, jedoch nur innerhalb einer zulässigen Teilmenge.</p></li></ul><p></p><p>Wir haben diesen Datensatz gewählt, weil er die Kernleistungsherausforderung widerspiegelt, die wir bei agentenbasierten und RAG-Systemen im Produktiveinsatz beobachten: Vektorähnlichkeit allein reicht nicht aus, die Suche wird häufig durch Filter eingeschränkt, und das System muss unter diesen Einschränkungen eine hohe Trefferquote bei gleichzeitig niedriger Latenz pflegen. Im Vergleich zu kleineren QA-Datensätzen spiegelt ein Korpus von 20 Millionen Dokumenten auch besser den Umfang und den Kandidatendruck wider, denen gefilterte ANN-Systeme in der Praxis ausgesetzt sind.</p><h2>Fazit</h2><p>In modernen KI-Architekturen, insbesondere solchen, die auf Kontext-Engineering aufbauen, ist die Geschwindigkeit der Vektorsuche kein unbedeutendes Implementierungsdetail. Sie ist ein Multiplikator. Wenn Agenten und Workflows durch Abrufen → Verarbeiten → Abrufen iterieren, beeinflusst die Abrufleistung direkt die End-to-End-Latenz, den Durchsatz und die Qualität des in das Modell eingespeisten Kontexts.</p><p>In unseren Benchmarks lieferte Elasticsearch konstant einen höheren Abruf bei geringerer Latenz als OpenSearch in Szenarien, in denen die Korrektheit vom Abruf des richtigen Dokuments und nicht nur eines ähnlichen Vektors abhängt. An einem kontrollierten Datensatz ist der Unterschied deutlich, und in der Produktion akkumulieren sich diese Gewinne über große Volumina von Abrufaufrufen, wodurch die Reaktionsfähigkeit verbessert, der Kapazitätsspielraum erhöht und die Infrastrukturkosten reduziert werden.</p><h3>Weitere Lektüre</h3><ol><li><p><a href="https://www.elastic.co/search-labs/blog/context-engineering-overview">Was ist Context Engineering?</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/series/context-engineering-hybrid-search-evolution">Die Entwicklung der hybriden Suche und des Kontext-Engineerings</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/context-engineering-relevance-ai-agents-elasticsearch">Der Einfluss der Relevanz auf das Kontext-Engineering für KI-Agenten</a></p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/opensearch-vs-elasticsearch-filtered-vector-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/opensearch-vs-elasticsearch-filtered-vector-search</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <dc:creator><![CDATA[Sachin Frayne]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4b38e5114bbf098c/6a170bf560084b3a6c3c459d/fb7ee623925ca6696d643e437ce8efe5fe749079-1280x720.png" length="0" type="image/png"/>
    <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Wie Sie Better Binary Quantization (BBQ) in Ihren Anwendungsfall implementieren können]]></title>
    <description><![CDATA[Erfahren Sie, warum Sie Better Binary Quantization (BBQ) in Ihrem Anwendungsfall einsetzen sollten und wie Sie dabei vorgehen.]]></description>
    <content:encoded><![CDATA[<p>Die Vektorsuche bildet die Grundlage für die Implementierung der semantischen Suche nach Text oder der Ähnlichkeitssuche nach Bildern, Videos oder Audio. Bei der Vektorsuche handelt es sich bei den Vektoren um mathematische Darstellungen von Daten, die sehr groß und manchmal langsam sein können. Die bessere binäre Quantisierung (im Folgenden als BBQ bezeichnet) funktioniert als Komprimierungsmethode für Vektoren. Es ermöglicht Ihnen, die richtigen Übereinstimmungen zu finden und gleichzeitig die Vektoren zu verkleinern, damit sie schneller durchsucht und verarbeitet werden können. Dieser Artikel behandelt BBQ und rescore_vector, ein Feld, das nur für quantisierte Indizes verfügbar ist und Vektoren automatisch neu bewertet.</p><p>Alle vollständigen Abfragen und Ausgaben, die in diesem Artikel erwähnt werden, finden Sie in unserem <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/how-and-why-bbq">Elasticsearch Labs-Code-Repository</a>.</p><h2>Warum sollten Sie Better Binary Quantization (BBQ) in Ihrem Anwendungsfall einsetzen?</h2>Hinweis: Um ein tieferes Verständnis der Mathematik hinter BBQ zu erhalten, lesen Sie bitte den <a href="https://www.elastic.co/de/search-labs/blog/bbq-implementation-into-use-case#further-learning">Abschnitt „Weiterführende Informationen“</a> weiter unten. Für die Zwecke dieses Blogs liegt der Schwerpunkt auf der Implementierung.<p>Die mathematischen Hintergründe sind zwar faszinierend, aber unerlässlich, wenn Sie vollständig verstehen wollen, warum Ihre Vektorsuchen präzise bleiben. Letztendlich dreht sich alles um Komprimierung, da sich herausgestellt hat, dass man mit den aktuellen Vektorsuchalgorithmen durch die Lesegeschwindigkeit der Daten begrenzt ist. Wenn Sie also all diese Daten im Arbeitsspeicher unterbringen können, erzielen Sie im Vergleich zum Lesen vom Speicher eine erhebliche Geschwindigkeitssteigerung (<a href="https://sre.google/static/pdf/rule-of-thumb-latency-numbers-letter.pdf">der Arbeitsspeicher ist etwa 200-mal schneller als SSDs</a>).</p><p>Es gibt ein paar Dinge zu beachten:</p><ul><li><p>Graphenbasierte Indizes wie <a href="https://arxiv.org/pdf/1603.09320">HNSW</a> (Hierarchical Navigable Small World) sind für die Vektorabfrage am schnellsten.</p><ul><li><p>HNSW: Ein ungefährer Suchalgorithmus für den nächsten Nachbarn, der eine mehrschichtige Graphstruktur erstellt, um effiziente hochdimensionale Ähnlichkeitssuchen zu ermöglichen.</p></li></ul></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt760bd95c206bfa8f/6a17e2ad505ac393f7ad8a95/590f3b3c72a76023a38a0436cd9ff90a9f80e936-1964x1262.png" alt="HNSW: Ein ungefährer Suchalgorithmus für den nächsten Nachbarn, der eine mehrschichtige Graphstruktur erstellt, um effiziente hochdimensionale Ähnlichkeitssuchen zu ermöglichen." /><ul><li><p>Die Geschwindigkeit von HNSW wird grundsätzlich durch die Datenlesegeschwindigkeit aus dem Speicher oder im schlimmsten Fall aus dem Speicher begrenzt.</p><ul><li><p>Idealerweise möchten Sie alle Ihre gespeicherten Vektoren in den Speicher laden können.</p></li></ul></li><li><p>Einbettungsmodelle erzeugen im Allgemeinen Vektoren mit Float32-Präzision, 4 Bytes pro Gleitkommazahl.</p></li><li><p>Und schließlich kann es, je nachdem, wie viele Vektoren und/oder Dimensionen Sie haben, sehr schnell passieren, dass Ihnen nicht genügend Speicher zur Verfügung steht, um alle Ihre Vektoren zu speichern.</p></li></ul><p>Wenn man dies als gegeben voraussetzt, erkennt man, dass schnell ein Problem entsteht, wenn man Millionen oder sogar Milliarden von Vektoren mit jeweils potenziell Hunderten oder sogar Tausenden von Dimensionen verarbeitet. Der Abschnitt „ <a href="https://www.elastic.co/de/search-labs/blog/bbq-implementation-into-use-case#approximate-numbers-on-the-compression-ratios">Ungefähre Zahlen zu den Kompressionsverhältnissen</a>“ enthält einige grobe Zahlen.</p><h2>Was brauchen Sie für den Anfang?</h2><p>Für den Anfang benötigen Sie Folgendes:</p><ul><li><p>Wenn Sie Elastic Cloud oder vor Ort verwenden, benötigen Sie eine höhere Version von Elasticsearch als 8.18. Während BBQ in 8.16 eingeführt wurde, verwenden Sie in diesem Artikel <code>vector_rescore</code>, das in 8.18 eingeführt wurde.</p></li><li><p>Darüber hinaus müssen Sie sicherstellen, dass in Ihrem Cluster ein <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/ml-settings.html">Knoten für maschinelles Lernen (ML)</a> vorhanden ist. (Hinweis: Zum Laden des Modells ist ein ML-Knoten mit mindestens 4 GB erforderlich, für die vollständige Produktionsarbeitslast werden Sie jedoch wahrscheinlich viel größere Knoten benötigen.)</p></li><li><p>Wenn Sie Serverless verwenden, müssen Sie eine Instanz auswählen, die für Vektoren optimiert ist.</p></li><li><p>Darüber hinaus benötigen Sie Grundkenntnisse im Umgang mit Vektordatenbanken. Wenn Sie mit den Konzepten der Vektorsuche in Elastic noch nicht vertraut sind, sollten Sie sich zunächst die folgenden Ressourcen ansehen:</p><ul><li><p><a href="https://www.elastic.co/de/search-labs/blog/elastic-vector-database-practical-example">Navigieren in einer Elastic Vector-Datenbank</a></p></li><li><p><a href="https://www.elastic.co/de/blog/retrieval-augmented-generation-explained">Die großen Ideen hinter der Retrieval Augmented Generation</a></p></li></ul></li></ul><h2>Verbesserte Binärquantisierung (BBQ)-Implementierung</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt18df00df95ff2ca7/6a17e2af414c6411989450df/4d388078495566f0527e931e0c2e38facdce83c6-1503x748.png" alt="Elasticsearch BBQ-Implementierung." /><p>Um diesen Blog einfach zu halten, verwenden Sie integrierte Funktionen, wenn diese verfügbar sind. In diesem Fall verfügen Sie über das Vektor-Einbettungsmodell <a href="https://www.elastic.co/de/guide/en/machine-learning/8.17/ml-nlp-e5.html"><code>.multilingual-e5-small</code></a> , das direkt in Elasticsearch auf einem Machine-Learning-Knoten ausgeführt wird. Beachten Sie, dass Sie das Modell <code>text_embedding</code> durch den Embedder Ihrer Wahl ersetzen können (<a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-openai.html">OpenAI</a>, <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-google-ai-studio.html">Google AI Studio</a>, <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/infer-service-cohere.html">Cohere</a> und viele mehr). Wenn Ihr bevorzugtes Modell noch nicht integriert ist, können Sie auch <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/bring-your-own-vectors.html">Ihre eigenen dichten Vektoreinbettungen mitbringen</a>.)</p><p>Zuerst müssen Sie einen Inferenzendpunkt erstellen, um Vektoren für einen bestimmten Textabschnitt zu generieren. Sie führen alle diese Befehle von der Kibana <a href="https://www.elastic.co/de/guide/en/kibana/8.18/console-kibana.html">Dev Tools-Konsole</a> aus. Dieser Befehl lädt <code>.multilingual-e5-small</code> herunter. Wenn es noch nicht vorhanden ist, wird Ihr Endpunkt eingerichtet. Dies kann eine Minute dauern. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/01-create-an-inference-endpoint-output.json">01-create-an-inference-endpoint-output.json</a> im Ordner „Outputs“ sehen. </p>PUT _inference/text_embedding/my_e5_model
{
  "service": "elasticsearch",
  "service_settings": {
    "num_threads": 1,
    "model_id": ".multilingual-e5-small",
    "adaptive_allocations": {
      "enabled": true,
      "min_number_of_allocations": 1
    }
  }
}<p>Sobald dies zurückgegeben wurde, ist Ihr Modell eingerichtet und Sie können mit dem folgenden Befehl testen, ob das Modell wie erwartet funktioniert. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/02-embed-text-output.json">02-embed-text-output.json</a> im Ordner „Outputs“ sehen.</p>POST _inference/text_embedding/my_e5_model
{
  "input": "my awesome piece of text"
}<p>Wenn bei Ihnen Probleme auftreten, weil Ihr trainiertes Modell keinem Knoten zugewiesen wird, müssen Sie Ihr Modell möglicherweise manuell starten.</p>POST _ml/trained_models/.multilingual-e5-small/deployment/_start<p>Erstellen wir nun eine neue Zuordnung mit 2 Eigenschaften, einem Standardtextfeld (<code>my_field</code>) und einem dichten Vektorfeld (<code>my_vector</code>) mit 384 Dimensionen, um der Ausgabe des Einbettungsmodells zu entsprechen. Sie werden auch <code>index_options.type to bbq_hnsw</code> überschreiben. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/03-create-byte-qauntized-index-output.json">03-create-byte-qauntized-index-output.json</a> im Ordner „Outputs“ sehen.</p>PUT bbq-my-byte-quantized-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "bbq_hnsw"
        }
      }
    }
  }
}<p>Um sicherzustellen, dass Elasticsearch Ihre Vektoren generiert, können Sie eine <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/ingest.html">Ingest-Pipeline</a> verwenden. Diese Pipeline erfordert drei Dinge: den Endpunkt (<code>model_id</code>), die <code>input_field</code> , für die Sie Vektoren erstellen möchten, und die <code>output_field</code> , in der diese Vektoren gespeichert werden. Der erste Befehl unten erstellt eine Inferenz-Ingest-Pipeline, die den <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/current/inference-apis.html">Inferenzdienst </a>im Hintergrund verwendet, und der zweite testet, ob die Pipeline ordnungsgemäß funktioniert. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/04-create-and-simulate-ingest-pipeline-output.json">04-create-and-simulate-ingest-pipeline-output.json</a> im Ordner „Outputs“ sehen. </p>PUT _ingest/pipeline/my_inference_pipeline
{
  "processors": [
    {
      "inference": {
        "model_id": "my_e5_model",
        "input_output": [
          {
            "input_field": "my_field",
            "output_field": "my_vector"
          }
        ]
      }
    }
  ]
}

POST _ingest/pipeline/my_inference_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "my_field": "my awesome text field"
      }
    }
  ]
}<p>Sie können nun mit den ersten beiden Befehlen unten einige Dokumente hinzufügen und mit dem dritten Befehl testen, ob Ihre Suchvorgänge funktionieren. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/05-bbq-index-output.json">05-bbq-index-output.json</a> im Ordner „Outputs“ überprüfen. </p>PUT bbq-my-byte-quantized-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT bbq-my-byte-quantized-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Wie in <a href="https://www.elastic.co/de/search-labs/blog/better-binary-quantization-lucene-elasticsearch#lucene-benchmarking">diesem Beitrag</a> empfohlen, sind Neubewertung und Überabtastung ratsam, wenn Sie auf nicht triviale Datenmengen skalieren, da sie dazu beitragen, eine hohe Rückrufgenauigkeit aufrechtzuerhalten und gleichzeitig von den Komprimierungsvorteilen zu profitieren. Ab Elasticsearch Version 8.18 können Sie dies auf diese Weise mit <a href="https://www.elastic.co/de/guide/en/elasticsearch/reference/8.18/knn-search.html#dense-vector-knn-search-rescoring">rescore_vector</a> tun. Die erwartete Ausgabe befindet sich in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/06-bbq-search-8-18-output.json">06-bbq-search-8-18-output.json</a> im Ordner „Outputs“.</p>GET bbq-my-byte-quantized-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "rescore_vector": {
              "oversample": 3
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<p>Wie schneiden diese Werte im Vergleich zu denen ab, die Sie für Rohdaten erhalten würden? Wenn Sie alles oben Gesagte noch einmal machen, aber mit <code>index_options.type: hnsw</code>, werden Sie sehen, dass die Ergebnisse sehr vergleichbar sind. Sie können die erwartete Ausgabe in der Datei <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/how-and-why-bbq/Outputs/07-raw-vector-output.json">07-raw-vector-output.json</a> im Ordner „Outputs“ sehen.</p>PUT my-raw-vector-index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text"
      },
      "my_vector": {
        "type": "dense_vector",
        "dims": 384,
        "index_options": {
          "type": "hnsw"
        }
      }
    }
  }
}

PUT my-raw-vector-index/_doc/1?pipeline=my_inference_pipeline
{
    "my_field": "my awesome text field"
}

PUT my-raw-vector-index/_doc/2?pipeline=my_inference_pipeline
{
    "my_field": "some other sentence"
}

GET my-raw-vector-index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "knn": {
            "field": "my_vector",
            "query_vector_builder": {
              "text_embedding": {
                "model_id": "my_e5_model",
                "model_text": "my awesome search field"
              }
            },
            "k": 10,
            "num_candidates": 100
          }
        }
      ]
    }
  },
  "_source": [
    "my_field"
  ]
}<h2>Ungefähre Zahlen zu den Kompressionsverhältnissen</h2><p>Bei der Arbeit mit der Vektorsuche können Speicher- und Arbeitsspeicheranforderungen schnell zu einer erheblichen Herausforderung werden. Die folgende Aufschlüsselung veranschaulicht, wie verschiedene Quantisierungstechniken den Speicherbedarf von Vektordaten drastisch reduzieren.</p><p>Vektoren (V)</p><p>Abmessungen (D)</p><p>roh (V x D x 4)</p><p>int8 (V x (D x 1 + 4))</p><p>int4 (V x (D x 0,5 + 4))</p><p>Grill (V x (D x 0,125 + 4))</p><p>10.000.000</p><p>384</p><p>14,31 GB</p><p>3,61 GB</p><p>1,83 GB</p><p>0,58 GB</p><p>50.000.000</p><p>384</p><p>71,53 GB</p><p>18,07 GB</p><p>9,13 GB</p><p>2,89 GB</p><p>100.000.000</p><p>384</p><p>143,05 GB</p><p>36,14 GB</p><p>18,25 GB</p><p>5,77 GB</p><h2>Fazit</h2><p>BBQ ist eine Optimierung, die Sie zur Komprimierung Ihrer Vektordaten anwenden können, ohne die Genauigkeit zu beeinträchtigen. Dabei werden Vektoren in Bits umgewandelt, sodass Sie die Daten effektiv durchsuchen und Ihre KI-Workflows skalieren können, um die Suche zu beschleunigen und die Datenspeicherung zu optimieren.</p><h2>Weiterführendes Lernen</h2><p>Wenn Sie mehr über BBQ erfahren möchten, sehen Sie sich unbedingt die folgenden Ressourcen an:</p><ul><li><p><a href="https://www.elastic.co/de/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Binäre Quantisierung (BBQ) in Lucene und Elasticsearch</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/bit-vectors-elasticsearch-bbq-vs-pq">Bessere binäre Quantisierung (BBQ) vs. Produktquantisierung</a></p></li><li><p><a href="https://www.elastic.co/de/search-labs/blog/optimized-scalar-quantization-elasticsearch">Optimierte skalare Quantisierung: Noch bessere binäre Quantisierung</a></p></li><li><p><a href="https://www.youtube.com/watch?v=04NzMt2Nigc">Bessere binäre Quantisierung (BBQ): Von Bytes bis BBQ, das Geheimnis einer besseren Vektorsuche von Ben Trent</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Sachin Frayne,Jessica Garson]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3dd0495b536b2615/6a17e2b0414c6488459450e3/66842055367cdd795532b01c167f2a4b03dc65e3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>