<?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/es/search-labs/author/ugo-sangiorgi</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/author/ugo-sangiorgi</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/author/ugo-sangiorgi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 17:12:12 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch BBQ vs. OpenSearch FAISS: comparación del rendimiento de la búsqueda vectorial]]></title>
    <description><![CDATA[Una comparación de rendimiento entre Elasticsearch BBQ y OpenSearch FAISS.]]></description>
    <content:encoded><![CDATA[<p><strong>Búsqueda vectorial con cuantificación binaria: Elasticsearch con BBQ es 5 veces más rápido que OpenSearch con FAISS</strong>. Elastic recibió solicitudes de nuestra comunidad para aclarar las diferencias de rendimiento entre Elasticsearch y OpenSearch, particularmente en el ámbito de la búsqueda semántica/búsqueda vectorial, por lo que realizamos estas pruebas de rendimiento para proporcionar comparaciones claras y basadas en datos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8792b5284e7a553/6a1709b9961e69a084c4cee6/7f4f8d08f7bee188423e4e65f0caefc7e34f0355-1600x681.png" alt="Elasticsearch BBQ vs. OpenSearch FAISS - Comparación de retiradas de velocidad y rendimiento" /><h2>Enfrentamiento de cuantificación binaria</h2><p>Almacenar vectores de alta dimensión en su forma original puede requerir mucha memoria. Las técnicas de cuantificación comprimen estos vectores en una representación compacta, lo que reduce significativamente la huella de memoria. Luego, la búsqueda opera en el espacio comprimido, lo que reduce la complejidad computacional y hace que las búsquedas sean más rápidas, especialmente en grandes conjuntos de datos.</p><p>Elastic está comprometida a convertir Lucene en un motor vectorial de alto rendimiento. Introdujimos <a href="https://www.elastic.co/es/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization</a> (BBQ) en Elasticsearch 8.16 sobre Lucene y lo evolucionamos aún más en 8.18 y 9.0. BBQ se basa en un nuevo enfoque de <a href="https://www.elastic.co/es/search-labs/blog/optimized-scalar-quantization-elasticsearch">cuantización escalar</a> que reduce las dimensiones float32 a bits, ofreciendo una reducción de memoria del ~95% manteniendo una alta calidad de clasificación.</p><p>OpenSearch, por otro lado, emplea múltiples motores vectoriales: nmslib (ahora obsoleto), Lucene y FAISS. En un <a href="https://www.elastic.co/es/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison">blog anterior</a>, comparamos Elasticsearch y OpenSearch para la búsqueda vectorial. Empleamos tres conjuntos de datos diferentes y probamos diferentes combinaciones de motores y configuraciones en ambos productos.</p><p>Este blog se centra en los algoritmos de cuantificación binaria disponibles actualmente en ambos productos. Probamos Elasticsearch con BBQ y OpenSearch con la <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">cuantificación binaria de FAISS</a> empleando la pista <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> Rally.</p><p>El objetivo principal fue evaluar el desempeño de ambas soluciones bajo el mismo nivel de recuperación. ¿Qué significa <em>recordar</em> ? La recuperación es una métrica que mide cuántos de los resultados relevantes son recuperados con éxito por un sistema de búsqueda.</p><p>En esta evaluación, recall@k es particularmente importante, donde <em>k</em> representa el número de resultados principales considerados. <strong>Recall@10</strong>, <strong>Recall@50 y Recall@100</strong> medir cuántos de los resultados relevantes reales aparecen en los 10, 50 y 100 elementos principales recuperados, respectivamente. La recuperación se expresa en una escala de 0 a 1 (o de 0% a 100% de precisión). Y eso es importante porque estamos hablando de KNN aproximado (ANN) y no de KNN exacto, donde la recordación es siempre 1 (100%).</p><p>Para cada valor de <em>k</em> también especificamos <em>n, </em>que es el número de candidatos considerados antes de aplicar la clasificación final. Esto significa que para Recall@10, Recall@50 y Recall@100, el sistema primero recupera <em>n</em> candidatos empleando el algoritmo de cuantificación binaria y luego los clasifica para determinar si los <em>k</em> resultados principales contienen los elementos relevantes esperados.</p><p>Al controlar <em>n</em>, podemos analizar el equilibrio entre eficiencia y precisión. Un <em>n</em> más alto generalmente <strong>aumenta la</strong> recuperación, ya que hay más candidatos disponibles para la clasificación, pero también <strong>aumenta</strong> la latencia y<strong> disminuye el </strong>rendimiento. Por el contrario, un <em>n</em> más bajo acelera la recuperación, pero puede reducir la recordación si se incluyen muy pocos candidatos relevantes en el conjunto inicial.</p><p>En esta comparación, Elasticsearch demostró una latencia más baja y un rendimiento más alto que OpenSearch en configuraciones idénticas.</p><h2>Metodología</h2><p>La configuración completa, junto con los scripts de Terraform, los manifiestos de Kubernetes y la pista de Rally específica está disponible en este <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq">repositorio</a> en <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq/rally-custom/custom_tracks/elasticsearch/openai_vector_bq"><em>openai_vector_bq</em></a>.</p><p>Al igual que con los puntos de referencia anteriores, empleamos un clúster de Kubernetes compuesto por:</p><ul><li><p>1 pool de nodos para Elasticsearch 9.0 con 3 máquinas <code>e2-standard-32</code> (128 GB de RAM y 32 CPU)</p></li><li><p>1 grupo de nodos para OpenSearch 2.19 con 3 máquinas <code>e2-standard-32</code> (128 GB de RAM y 32 CPU)</p></li><li><p>1 grupo de nodos para Rally con 2 máquinas <code>e2-standard-4</code> (16 GB de RAM y 4 CPU)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt934e988e96a5849f/6a1709bbacf08838f9be9ac1/169bb6033f6eebfd1b177b3446bf916fde4ee5c5-1600x856.png" alt="Montaje de la metodología Elasticsearch BBQ vs Opensearch FAISS" /><p>Configuramos un clúster de Elasticsearch versión 9.0 y un clúster de OpenSearch versión 2.19.</p><p>Tanto Elasticsearch como OpenSearch se probaron exactamente con la misma configuración: usamos <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> pista de Rally con <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/commit/b97d5d95c22c8cf862f2030964524bdd156a5da3">algunas modificaciones</a> , que emplea 2,5 millones de documentos del <a href="https://huggingface.co/datasets/BeIR/nq">conjunto de datos NQ</a> enriquecidos con incrustaciones generadas con el <a href="https://openai.com/blog/new-and-improved-embedding-model">modelo text-embedding-ada-002</a> de OpenAI.</p>{
  "source-file": "open_ai_corpus-initial-indexing.json.bz2",
  "document-count": 2580961,
  "compressed-bytes": 32076749416,
  "uncompressed-bytes": 90263571686
}<p>Los resultados informan sobre la latencia y el rendimiento medidos en diferentes niveles de recuperación (recall@10, recall@50 y recall@100) empleando 8 clientes simultáneos para realizar operaciones de búsqueda. Usamos un solo fragmento y no réplicas.</p><p>Ejecutamos las siguientes combinaciones de k-n-rescore, p. ej. 10-2000-2000, o <em>K:10</em>, <em>N:2000</em> y <em>Rescore:2000</em> recuperarían los mejores K (10) sobre N candidatos (2000) aplicando un Rescore sobre 2000 resultados (que es equivalente a un "factor de sobremuestreo" de 1). Cada búsqueda se ejecutó 10.000 veces con 1000 búsquedas como calentamiento:</p><p></p><p><u><strong>Recall@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>Recall@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>Recall@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>Para replicar el punto de referencia, los manifiestos de Kubernetes para rally-elasticsearch y rally-opensearch tienen todas las variables relevantes externalizadas en un ConfigMap, disponible <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-es-bq.yml">aquí</a> (ES) y <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-os-bq.yml">aquí</a> (SO). El parámetro <em>search_ops</em> se puede personalizar para probar cualquier combinación de k, n y rescore.</p><h3>Configuración de OpenSearch Rally</h3><p><code>/k8s/rally-openai_vector-os-bq.yml</code></p>apiVersion: v1
kind: ConfigMap
metadata:
  name: rally-params-os
  labels:
    app: rally-opensearch
data:
  user-tags.json: |
    {
      "product": "OpenSearch",
      "product-version": "OpenSearch-2.19.0",
      "product-label": "OpenSearch-2.19-faiss",
      "benchmark-run": "19-feb-recall@100"
    }
  track-params.json: |
    {
      "mapping_type": "vectors-only-mapping-with-docid",
      "standalone_search_clients": 8,
      "standalone_search_iterations": 5000,
      "ann_threshold": 0,
      "vector_mode": "on_disk",
      "compression_level": "32x",
      "vector_method_name": "hnsw",
      "vector_method_engine": "faiss",
      "search_ops": [
        [100, 200, 200],
        [100, 250, 250],
        [100, 300, 300],
        [100, 500, 500],
        [100, 750, 750],
        [100, 1000, 1000],
        [100, 1200, 1200],
        [100, 1500, 1500],
        [100, 2000, 2000]
      ]
    }<h3>Configuración del índice de Opensearch</h3><p>Las variables de ConfigMap se emplean en la configuración del índice, algunos parámetros se dejan sin cambios. La cuantización de 1 bit en OpenSearch se configura <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">estableciendo el nivel de compresión en "32x".</a></p><p><code>index-vectors-only-mapping-with-docid-mapping.json</code></p>{
  "settings": {
    {% if preload_pagecache %}
    "index.store.preload": [
      "vec", "vex", "vem", "veq", "veqm", "veb", "vebm"
    ],
    {% endif %}
    "index.number_of_shards": {{ number_of_shards | default(1) }},
    "index.number_of_replicas": {{ number_of_replicas | default(0) }},
    "index.knn": true,
    "index.knn.advanced.approximate_threshold": {{ ann_threshold | default(15000) }}
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "docid": {
        "type": "keyword"
      },
      "emb": {
        "type": "knn_vector",
        "dimension": 1536,
        "space_type": "innerproduct",
        "data_type": "float",
        "mode": {{ vector_mode | default("in_memory") | tojson }},
        "compression_level": {{ compression_level | default("32x") | tojson }},
        "method": {
          "name": {{ vector_method_name | default("hnsw") | tojson }},
          "engine": {{ vector_method_engine | default("faiss") | tojson }},
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}<h3>Configuración de Elasticsearch Rally</h3><p><code>/k8s/rally-openai_vector-es-bq.yml</code></p>apiVersion: v1
kind: ConfigMap
metadata:
  name: rally-params-es
  labels:
    app: rally-elasticsearch
data:
  user-tags.json: |
    {
      "product": "Elasticsearch",
      "product-version": "Elasticsearch-9.0.0-ade01164",
      "product-label": "Elasticsearch-9.0-BBQ",
      "benchmark-run": "19-feb-recall@100"
    }
  track-params.json: |
    {
      "mapping_type": "vectors-only-mapping-with-docid",
      "standalone_search_clients": 8,
      "standalone_search_iterations": 5000,
      "vector_index_type": "bbq_hnsw",
      "search_ops": [
        [100, 200, 200],
        [100, 250, 250],
        [100, 300, 300],
        [100, 500, 500],
        [100, 750, 750],
        [100, 1000, 1000],
        [100, 1200, 1200],
        [100, 1500, 1500],
        [100, 2000, 2000]
      ]
    }<h3>Configuración del índice de Elasticsearch</h3><p><code>index-vectors-only-mapping-with-docid-mapping.json</code></p>{
  "settings": {
    {# non-serverless-index-settings-marker-start #}
    {%- if build_flavor != "serverless" or serverless_operator == true -%}
    {% if preload_pagecache %}
    "index.store.preload": [ "vec", "vex", "vem", "veq", "veqm", "veb", "vebm" ],
    {% endif %}
    "index.number_of_shards": {{ number_of_shards | default(1) }},
    "index.number_of_replicas": {{ number_of_replicas | default(0) }}
    {%- endif -%}
    {# non-serverless-index-settings-marker-end #}
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "docid": {
        "type": "keyword"
      },
      "emb": {
        "type": "dense_vector",
        "element_type": "float",
        "dims": 1536,
        "index": true,
        "similarity": "dot_product",
        "index_options": {
          "type": {{ vector_index_type | default("bbq_hnsw") | tojson }},
          "ef_construction": 100,
          "m": 16
        }
      }
    }
  }
}<h2>Resultados</h2><p>Hay varias formas de interpretar los resultados. Tanto para la latencia como para el rendimiento, trazamos un gráfico simplificado y detallado en cada nivel de recuperación. Es fácil ver diferencias si consideramos que "más alto es mejor" para cada métrica. Sin embargo, la latencia es negativa (más baja es mejor), mientras que el rendimiento es positivo. Para los gráficos simplificados, usamos <strong>(recuperación / latencia) * 10000 </strong>(llamado simplemente "velocidad") y<strong> recuperación * rendimiento</strong>, por lo que ambas métricas significan que más velocidad y más rendimiento son mejores. Vamos a ello.</p><h3>Recuperación @ 10 - simplificado</h3><p>En ese nivel de recuperación, Elasticsearch BBQ es hasta <strong>5 veces más rápido </strong>(3,9 veces más rápido en promedio) y tiene <strong>3,2 veces más rendimiento</strong> en promedio que OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3de6b3460127a8ae/6a1709bcb339d55975769f6f/d580ad53e8974bd3aa75957c413a0136c4e465c5-1600x681.png" alt="Elasticsearch BBQ es hasta 5 veces más rápido (3,9 veces más rápido de media) y tiene un rendimiento media 3,2 veces mayor que OpenSearch FAISS en velocidad y Recall@10" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd47045013cac5e9d/6a1709be0e2e49599a41a088/18edce667fe36ab95033264ef8df6f352dda2425-2044x866.png" alt="Elasticsearch BBQ es hasta 5 veces más rápido (3,9 veces más rápido de media) y tiene un rendimiento media 3,2 veces mayor que OpenSearch FAISS." /><h4>Retiro @ 10 - Detallado</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ecb02d4a2967dbd/6a1709bf14b270c04fe3c5c6/a7459b87e679f4ad963d0e2f1685499b40f6f050-1600x799.png" alt="Comparación detallada de latencias de recall@10 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt182da309ad6cfd39/6a1709c166c4f99077f8bfd8/c6036f55a13377654d296eb3148c7199e1965475-1600x799.png" alt="Comparación detallada de recall@10 rendimiento Elasticsearch BBQ vs Opensearch FAISS." /><p></p><p>tarea</p><p>latencia.media</p><p>rendimiento.mean</p><p>avg_recall</p><p>Elasticsearch-9.0-BBQ</p><p>10-100-100</p><p>11.70</p><p>513.58</p><p>0.89</p><p>Elasticsearch-9.0-BBQ</p><p>10-1000-100</p><p>27.33</p><p>250.55</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-1500-1500</p><p>35.93</p><p>197.26</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-200-200</p><p>13.33</p><p>456.16</p><p>0.92</p><p>Elasticsearch-9.0-BBQ</p><p>10-2000-2000</p><p>44.27</p><p>161.40</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>10-40-40</p><p>10.97</p><p>539.94</p><p>0.84</p><p>Elasticsearch-9.0-BBQ</p><p>10-50-50</p><p>11.00</p><p>535.73</p><p>0.85</p><p>Elasticsearch-9.0-BBQ</p><p>10-500-500</p><p>19.52</p><p>341.45</p><p>0.93</p><p>Elasticsearch-9.0-BBQ</p><p>10-750-750</p><p>22.94</p><p>295.19</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>10-100-100</p><p>35.59</p><p>200.61</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>10-1000-1000</p><p>156.81</p><p>58.30</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-1500-1500</p><p>181.79</p><p>42.97</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-200-200</p><p>47.91</p><p>155.16</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>10-2000-2000</p><p>232.14</p><p>31.84</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-40-40</p><p>27.55</p><p>249.25</p><p>0.92</p><p>OpenSearch-2.19-faiss</p><p>10-50-50</p><p>28.78</p><p>245.14</p><p>0.92</p><p>OpenSearch-2.19-faiss</p><p>10-500-500</p><p>79.44</p><p>97.06</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>10-750-750</p><p>104.19</p><p>75.49</p><p>0.96</p><h3>Recuperación @ 50 - simplificado</h3><p>En ese nivel de recuperación, Elasticsearch BBQ es <strong>hasta 5 veces más rápido</strong> (4,2 veces más rápido en promedio) y tiene <strong>3,9 veces más rendimiento</strong> en promedioque OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt486683f2c7a1d677/6a1709c2a6c2b995bde796a3/3189ffb330948b35854eeea9ae317d4846c14972-1600x681.png" alt="Comparación de rendimiento vectorial Recal @50 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba830c6741784682/6a1709c4a292990627d00ff7/607383d674dcf0b8f94bfb1a450063f52fcbeb15-2060x876.png" alt="Elasticsearch BBQ puede ser hasta 5 veces más rápido (4,2 veces más rápido de media) y tiene un rendimiento media 3,9 veces mayor que OpenSearch FAISS." /><h4>Resultados detallados - Recall @ 50</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt821775e7f87e5ede/6a1709c6a6c2b90af3e796a7/ebfffe0b776aad31dd03d315cfbf5aa098b41226-1600x789.png" alt="Recall@50 Resultados de latencia de Elasticsearch BBQ y Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4f47784ed1017c15/6a1709c7e8fbce0fbe39fbf5/ae20cf870a65c400a2112bbad62eb56e244f549a-1600x799.png" alt="Recall@50 Resultados del rendimiento de Elasticsearch BBQ y Opensearch FAISS" /><p></p><p>Tarea</p><p>Latencia media</p><p>Media de rendimiento</p><p>Retiro promedio</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>Retiro @ 100</h3><p>En ese nivel de recuperación, Elasticsearch BBQ es <strong>hasta 5 veces más rápido </strong>(promedio 4,6 veces más rápido) y tiene <strong>3,9 veces más rendimiento </strong>en promedio que OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt380eb9165343a7b3/6a1709c9acf0882669be9ac5/d3f29db64cbde9956de1fa3ae64a75f15141a2bb-1600x681.png" alt="Retirar los resultados de FAISS de @100 Elasticsearch BBQ VS Opensearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt505ce8aa70898390/6a1709cb1949f73a37e7a9bb/10aff7f8c61fdac895b9ba9c5342baf239ba3ffc-2072x864.png" alt="Comparación de latencia y rendimiento FAISS en Elasticsearch BBQ y Opensearch" /><h4>Resultados detallados - Recall @ 100</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2a73e29940e9d6b/6a1709cccf4f257615b2d138/8790fdf9512b850447f6875fb69969f6f1d4da5f-1600x799.png" alt="Resultados detallados de latencia - Retirada @ 100 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c91ca21da03d96/6a1709ce0c4857d3fc01aa39/d47032fac6c288cd4eedd9f25001e417b2fa9d65-1600x787.png" alt="Resultados detallados de rendimiento - Recall @ 100 Elasticsearch BBQ vs Opensearch FAISS." /><p></p><p>tarea</p><p>latencia.media</p><p>rendimiento.mean</p><p>avg_recall</p><p>Elasticsearch-9.0-BBQ</p><p>100-1000-1000</p><p>27.82</p><p>243.22</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-1200-1200</p><p>31.14</p><p>224.04</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-1500-1500</p><p>35.98</p><p>193.99</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-200-200</p><p>14.18</p><p>403.86</p><p>0.88</p><p>Elasticsearch-9.0-BBQ</p><p>100-2000-2000</p><p>45.36</p><p>159.88</p><p>0.95</p><p>Elasticsearch-9.0-BBQ</p><p>100-250-250</p><p>14.77</p><p>433.06</p><p>0.90</p><p>Elasticsearch-9.0-BBQ</p><p>100-300-300</p><p>14.61</p><p>375.54</p><p>0.91</p><p>Elasticsearch-9.0-BBQ</p><p>100-500-500</p><p>18.88</p><p>340.37</p><p>0.93</p><p>Elasticsearch-9.0-BBQ</p><p>100-750-750</p><p>23.59</p><p>285.79</p><p>0.94</p><p>OpenSearch-2.19-faiss</p><p>100-1000-1000</p><p>142.90</p><p>58.48</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>100-1200-1200</p><p>153.03</p><p>51.04</p><p>0.95</p><p>OpenSearch-2.19-faiss</p><p>100-1500-1500</p><p>181.79</p><p>43.20</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>100-200-200</p><p>50.94</p><p>131.62</p><p>0.83</p><p>OpenSearch-2.19-faiss</p><p>100-2000-2000</p><p>232.53</p><p>33.67</p><p>0.96</p><p>OpenSearch-2.19-faiss</p><p>100-250-250</p><p>57.08</p><p>131.23</p><p>0.87</p><p>OpenSearch-2.19-faiss</p><p>100-300-300</p><p>62.76</p><p>120.10</p><p>0.89</p><p>OpenSearch-2.19-faiss</p><p>100-500-500</p><p>84.36</p><p>91.54</p><p>0.93</p><p>OpenSearch-2.19-faiss</p><p>100-750-750</p><p>111.33</p><p>69.95</p><p>0.94</p><h2>Mejoras en el asado</h2><p>BBQ recorrió un largo camino desde su primer lanzamiento. En Elasticsearch 8.16, en aras de la comparación, incluimos una ejecución de referencia de 8.16 junto con la actual, y podemos ver cómo la recuperación y la latencia mejoraron desde entonces.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f1f7ae1bb425a3a/6a1709cf67045bde8e45c192/45a0acfe5985bff28ccada76ec4eca190fe65f72-1600x799.png" alt="Las mejoras en la recuperación de latencia de Elasticsearch 9.0 BBQ se compararon con Elasticsearch 8.16 BBQ" /><p>En Elasticsearch 8.18 y 9.0, reescribimos el algoritmo central para cuantificar los vectores. Entonces, si bien BBQ en 8.16 fue bueno, las versiones más nuevas son aún mejores. Puedes leer sobre esto <a href="https://www.elastic.co/es/search-labs/blog/optimized-scalar-quantization-elasticsearch">aquí</a> y <a href="https://www.elastic.co/es/search-labs/blog/scalar-quantization-optimization">aquí</a>. En resumen, cada vector se cuantifica individualmente a través de cuantiles escalares optimizados. Como resultado, los usuarios se benefician de una mayor precisión en la búsqueda vectorial sin comprometer el rendimiento, lo que hace que la recuperación vectorial de Elasticsearch sea aún más poderosa.</p><h2>Conclusión</h2><p>En esta comparación de rendimiento entre Elasticsearch BBQ y OpenSearch FAISS, Elasticsearch supera significativamente a OpenSearch para la búsqueda vectorial, logrando velocidades de consulta hasta 5 veces más rápidas y un rendimiento 3,9 veces mayor en promedio en varios niveles de recuperación.</p><p>Los hallazgos clave incluyen:</p><ul><li><p><strong>Recall@10</strong>: Elasticsearch BBQ es hasta 5 veces más rápido (3,9 veces más rápido en promedio) y tiene 3,2 veces más rendimiento en promedio en comparación con OpenSearch FAISS.</p></li><li><p><strong>Recall@50</strong>: Elasticsearch BBQ es hasta 5 veces más rápido (4,2 veces más rápido en promedio) y tiene 3,9 veces más rendimiento en promedio en comparación con OpenSearch FAISS.</p></li><li><p><strong>Recall@100</strong>: Elasticsearch BBQ es hasta 5 veces más rápido (4,6 veces más rápido en promedio) y tiene 3,9 veces más rendimiento en promedio en comparación con OpenSearch FAISS.</p></li></ul><p>Estos resultados resaltan los beneficios de eficiencia y rendimiento de Elasticsearch BBQ, particularmente en escenarios de búsqueda vectorial de alta dimensión. La técnica Better Binary Quantization (BBQ), introducida en Elasticsearch 8.16, proporciona una reducción sustancial de la memoria (~95%) al tiempo que mantiene una alta calidad de clasificación, lo que la convierte en una opción superior para aplicaciones de búsqueda vectorial a gran escala.</p><p>En Elastic, estamos innovando incansablemente para mejorar Apache Lucene y Elasticsearch para proporcionar la mejor base de datos vectorial para casos de uso de búsqueda y recuperación, incluida RAG (Retrieval Augmented Generation). Nuestros <a href="https://www.elastic.co/es/search-labs/blog/optimized-scalar-quantization-elasticsearch">avances recientes</a> aumentaron significativamente el rendimiento, haciendo que la búsqueda vectorial sea más rápida y eficiente en cuanto al espacio que antes, basar en las ganancias de Lucene 10. Este blog es otra ilustración de esa innovación.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-bbq-vs-opensearch-faiss</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-bbq-vs-opensearch-faiss</guid>
    <category><![CDATA[Base de datos vectorial]]></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: Comparación del rendimiento de búsqueda vectorial]]></title>
    <description><![CDATA[Elasticsearch es de 2 a 12 veces más rápido que OpenSearch para la búsqueda vectorial]]></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 es hasta 12 veces más rápido</a> - En Elastic hemos recibido numerosas solicitudes de nuestra comunidad para aclarar las diferencias de rendimiento entre Elasticsearch y OpenSearch, particularmente en el realm de la búsqueda semántica/búsqueda vectorial, por lo que hemos efectuado esta prueba de rendimiento para proporcionar una comparación clara y basada en datos: sin ambigüedades, solo datos directos para informar a nuestros usuarios. Los resultados muestran que <strong>Elasticsearch es hasta 12 veces más rápido</strong> que OpenSearch para la búsqueda de vectores y, por lo tanto, requiere menos recursos computacionales. Esto refleja el enfoque de Elastic en consolidar Lucene como la mejor base de datos vectorial para casos de uso de búsqueda y recuperación.</p><p>La búsqueda vectorial está revolucionando la forma en que hacemos búsquedas de similitud, particularmente en campos como la IA y el machine learning. Con la creciente adopción de modelos de incrustación de vectores, la capacidad de búsqueda eficiente a través de millones de vectores de alta dimensionalidad se vuelve crítica.</p><p>Cuando se trata de habilitar bases de datos vectoriales, Elastic y OpenSearch han adoptado enfoques notablemente diferentes. Elastic ha invertido mucho en la optimización de Apache Lucene junto con Elasticsearch para elevarlos como la opción de primer nivel para las aplicaciones de búsqueda vectorial. Por el contrario, OpenSearch ha ampliado su enfoque, integrando otras implementaciones de búsqueda vectorial y explorando más allá del alcance de Lucene. Nuestro enfoque en Lucene es estratégico, lo que nos permite brindar soporte sumamente integrado en nuestra versión de Elasticsearch, resultando en un conjunto de características mejorado en el que cada componente complementa y amplifica las capacidades del otro.</p><p>Este blog presenta una comparación detallada entre Elasticsearch 8.14 y OpenSearch 2.14, considerando diferentes configuraciones y motores vectoriales. En este análisis de rendimiento, Elasticsearch demostró ser la plataforma superior para las operaciones de búsqueda de vectores. Incluso las próximas <a href="https://www.elastic.co/search-labs/blog/vector-similarity-computations-ludicrous-speed">características</a> ampliarán las diferencias de forma más <a href="https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">significativa</a>. Cuando se enfrentó a OpenSearch, sobresalió en todas las pistas de referencia, <strong>con un rendimiento de 2 a 12 veces más rápido en promedio</strong>. Esto sucedió en todos los casos que utilizaban cantidades y dimensiones vectoriales variables, como <code>so_vector</code> (2M vectores, 768D), <code>openai_vector</code> (2.5M vectores, 1536D) y <code>dense_vector</code> (10M vectores, 96D), todos disponibles en <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance">este repositorio</a> junto con los scripts de Terraform para provisionar toda la infraestructura requerida en Google Cloud y los manifiestos de Kubernetes para ejecutar las pruebas.</p><p>Los resultados detallados en este blog complementan los resultados de un <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap">estudio previamente publicado y validado por terceros</a> que muestra que Elasticsearch es 40%–140% más rápido que OpenSearch para las operaciones de análisis de búsqueda más comunes: consulta de texto, clasificación, rango, histograma de fechas y filtrado de términos. Ahora podemos agregar otro diferenciador: la búsqueda vectorial.</p><h2>Hasta 12 veces más rápido desde el primer momento</h2><p>Nuestros puntos de referencia enfocados en los cuatro conjuntos de datos vectoriales involucraron tanto búsquedas de KNN aproximados como de KNN exactos, considerando diferentes tamaños, dimensiones y configuraciones, totalizando <code>40.189.820</code> solicitudes de búsqueda no almacenadas en caché. Los resultados: <strong>Elasticsearch es hasta 12 veces más rápido</strong> que OpenSearch para la búsqueda vectorial y, por lo tanto, requiere menos recursos computacionales.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34b83c6eba3bcb6e/6a17d727dbb4ff18d6fb54fb/cdb26e91f085b90e9b12aeb8fee53b04d365ecae-1440x1156.webp" alt="promedio de P90" /><p>Figura 1: Tareas agrupadas para ANN y KNN exacto en diferentes combinaciones en Elasticsearch y OpenSearch.</p><p>Los grupos como <code>knn-10-100</code> implican una búsqueda KNN con  y . En la búsqueda vectorial HNSW,  determina el número de vecinos más cercanos a recuperar para un vector de consulta. Especifica cuántos vectores similares se deben encontrar como resultado.  establece el número de vectores candidatos a recuperar en cada segmento. Más candidatos pueden mejorar la precisión, pero requieren mayores recursos computacionales.</p><p>También probamos con diferentes técnicas de cuantización y aprovechamos las optimizaciones específicas del motor; los resultados detallados para cada pista, tarea y motor vectorial están disponibles a continuación.</p><h2>KNN exacto y KNN aproximado</h2><p>Al tratar con conjuntos de datos y casos de uso variados, el enfoque correcto para la búsqueda vectorial será diferente. En este blog, todas las tareas indicadas como <code>knn-*</code> como <code>knn-10-100</code> utilizan <strong>KNN aproximado</strong> y <code>script-score-*</code> se refieren a <strong>KNN exacto</strong>, pero ¿en qué se diferencian y por qué son importantes?</p><p>En definitiva, si estás manejando conjuntos de datos más sustanciales, el método preferido es Approximate K-Nearest Neighbor (ANN) debido a su escalabilidad superior. Para conjuntos de datos más modestos que pueden requerir un proceso de filtración, el método Exact KNN es ideal.</p><p>El KNN exacto utiliza un método de fuerza bruta, calculando la distancia entre un vector y todos los demás vectores en el conjunto de datos. Luego clasifica estas distancias para encontrar los  vecinos más cercanos. Si bien este método garantiza una coincidencia exacta, enfrenta desafíos de escalabilidad para conjuntos de datos grandes y de alta dimensionalidad. Sin embargo, hay muchos casos en los que se necesita un KNN exacto:</p><ul><li><p><strong>Recalificación</strong>: En escenarios que involucran búsquedas léxicas o semánticas seguidas de recalificación basada en vectores, el KNN exacto es esencial. Por ejemplo, en un motor de búsqueda de productos, los resultados de búsqueda iniciales se pueden filtrar en función de consultas textuales (por ejemplo, palabras clave, categorías) y luego se emplean vectores asociados con los elementos filtrados para una evaluación de similitud más precisa.</p></li><li><p><strong>Personalización</strong>: Al tratar con un gran número de usuarios, cada uno representado por un número relativamente pequeño (como 1 millón) de vectores distintos, la clasificación del índice por metadatos específicos del usuario (por ejemplo, user_id) y el cálculo de puntajes mediante fuerza bruta con vectores se vuelve eficiente. Este enfoque permite recomendaciones personalizadas o la entrega de contenido basadas en comparaciones vectoriales precisas adaptadas a las preferencias individuales del usuario.</p></li></ul><p>Por lo tanto, Exact KNN garantiza que la clasificación final y las recomendaciones basadas en la similitud de vectores sean precisas y estén adaptadas a las preferencias del usuario.</p><p>Por otro lado, el KNN aproximado (o ANN) emplea métodos para que la búsqueda de datos sea más rápida y eficaz que el KNN exacto, especialmente en conjuntos de datos grandes y de alta dimensionalidad. En lugar de un enfoque de fuerza bruta, que mide la distancia más cercana exacta entre una consulta y todos los puntos, lo que plantea problemas de cálculo y escalado, el ANN emplea ciertas técnicas para reestructurar de forma eficiente los índices y las dimensiones de los vectores buscables en el conjunto de datos. Aunque esto puede provocar una ligera imprecisión, aumenta considerablemente la velocidad del proceso de búsqueda, lo que lo convierte en una alternativa eficaz para tratar con grandes conjuntos de datos.</p><p>En este blog, todas las tareas indicadas como <code>knn-*</code> como <code>knn-10-100</code> usan <strong>KNN aproximado</strong> y <code>script-score-*</code> se refieren a <strong>KNN exacto</strong>.</p><h2>Metodología de prueba</h2><p>Si bien Elasticsearch y OpenSearch son similares en términos de API para las operaciones de búsqueda BM25, ya que este último es una bifurcación del primero, no ocurre lo mismo con la búsqueda vectorial, que se introdujo después de la bifurcación. OpenSearch adoptó un enfoque diferente al de Elasticsearch en lo que respecta a los algoritmos, al introducir otros dos motores — <code>nmslib</code> y <code>faiss</code> — además de <code>lucene</code>, cada uno con sus configuraciones y limitaciones específicas (por ejemplo, <code>nmslib</code> en OpenSearch no permite filtros, una característica esencial para muchos casos de uso).</p><p>Los tres motores utilizan el algoritmo Hierarchical Navigable Small World (HNSW), que es eficiente para la búsqueda aproximada de vecinos más cercanos y especialmente potente al trabajar con datos de alta dimensionalidad. Es importante señalar que <code>faiss</code> también admite un segundo algoritmo, <code>ivf</code>, pero dado que requiere entrenamiento previo en el conjunto de datos, nos centraremos únicamente en HNSW. La idea núcleo de HNSW es organizar los datos en varias capas de grafos conectados, donde cada capa representa una granularidad diferente del conjunto de datos. La búsqueda comienza en la capa superior con la vista más burda y progresa hacia capas cada vez más finas hasta llegar al nivel base.</p><p>Ambos motores de búsqueda se probaron en condiciones idénticas en un entorno controlado para asegurar la imparcialidad. El método aplicado es similar a <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap#testing-methodology">esta comparación de rendimiento publicada anteriormente</a>, con grupos de nodo dedicados para Elasticsearch, OpenSearch y Rally. El <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/main/terraform/main.tf">script de terraform</a> está disponible (junto con todas las fuentes) para provisionar un clúster de Kubernetes con:</p><ul><li><p>1 grupo de nodo para Elasticsearch con 3 <code>e2-standard-32</code> máquinas (128 GB de RAM y 32 CPU)</p></li><li><p>Grupo de 1 Node para OpenSearch con 3 máquinas <code>e2-standard-32</code> (128 GB de RAM y 32 CPU)</p></li><li><p>Grupo de 1 Node para Rally con 2 máquinas <code>t2a-standard-16</code> (64 GB de RAM y 16 CPU)</p></li></ul><p>Cada "pista" (o prueba) se ejecutó 10 veces para cada configuración, que incluyó diferentes motores, diferentes configuraciones y diferentes tipos de vectores. Las pistas tienen tareas que se repiten entre 1000 y 10 000 veces, dependiendo de la pista. Si una de las tareas de una pista fallaba, por ejemplo, debido a un tiempo de espera de red, todas las tareas se descartaban, por lo que todos los resultados representan pistas que comenzaron y terminaron sin problemas. Todos los resultados de las pruebas se validan estadísticamente, lo que garantiza que las mejoras no sean una coincidencia.</p><h2>Resultados detallados</h2><p>¿Por qué comparar usando el percentil 99 y no el promedio de latencia? Consideremos un ejemplo hipotético de los precios promedio de las viviendas en un barrio determinado. El precio promedio puede indicar una zona cara, pero en una inspección más cercana, puede resultar que la mayoría de las viviendas estén valoradas mucho más bajo, con solo unas pocas propiedades de lujo inflando la cifra promedio. Esto ilustra cómo el precio promedio puede no representar con precisión el espectro completo de valores de las viviendas en esa zona. Esto es similar a examinar los tiempos de respuesta, en los que el promedio puede ocultar problemas críticos.</p><h4>Tareas</h4><ul><li><p>KNN aproximado con k:10 n:50</p></li><li><p>KNN aproximado con k:10 n:100</p></li><li><p>KNN aproximado con k:100 n:1000</p></li><li><p>KNN aproximado con k:10 n:50 y filtros de palabras clave</p></li><li><p>KNN aproximado con k:10 n:100 y filtros de palabras clave</p></li><li><p>KNN aproximado con k:100 n:1000 y filtros de palabras clave</p></li><li><p>KNN aproximado con k:10 n:100 en combinación con indexación</p></li><li><p>KNN exacto (puntaje del script)</p></li></ul><h4>Motores vectoriales</h4><ul><li><p><code>lucene</code> en Elasticsearch y OpenSearch, ambos en la versión 9.10</p></li><li><p><code>faiss</code> en OpenSearch</p></li><li><p><code>nmslib</code> en OpenSearch</p></li></ul><h4>Tipos de vectores</h4><ul><li><p><code>hnsw</code> en Elasticsearch y OpenSearch</p></li><li><p><code>int8_hnsw</code> en Elasticsearch (HNSW con cuantificación automática de 8 bits: <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">enlace</a>)</p></li><li><p><code>sq_fp16 hnsw </code>en OpenSearch (HNSW con cuantificación automática de 16 bits: <a href="https://opensearch.org/docs/2.14/search-plugins/knn/knn-vector-quantization#faiss-16-bit-scalar-quantization">enlace</a>)</p></li></ul><h4>Búsqueda de segmentos concurrentes y lista para usar</h4><p>Como probablemente sabes, Lucene es una biblioteca de motor de búsqueda de texto de alto rendimiento escrita en Java que sirve como estructura para muchas plataformas de búsqueda como Elasticsearch, OpenSearch y Solr. Básicamente, Lucene organiza los datos en segmentos, que son esencialmente índices autónomos que permiten a Lucene ejecutar búsquedas de manera más eficiente. Entonces, cuando emites una búsqueda a cualquier motor de búsqueda basado en Lucene, tu búsqueda terminará siendo ejecutada en esos segmentos, ya sea secuencialmente o en paralelo.</p><p>OpenSearch introdujo la búsqueda de segmentos concurrentes como una opción adicional y no la utiliza por defecto; debes habilitarla mediante una configuración especial del índice <code>index.search.concurrent_segment_search.enabled</code> como se detalla <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/">aquí</a>, con algunas <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/#other-considerations">limitaciones</a>.</p><p>Elasticsearch, por otro lado, hace búsquedas en segmentos de forma concurrente <a href="https://github.com/elastic/elasticsearch/pull/101230">listas para usar</a>, por lo que las comparaciones que hacemos en este blog tendrán en cuenta, además de los diferentes motores de vectores y tipos de vectores, también las diferentes configuraciones:</p><ul><li><p>Elasticsearch ootb: Elasticsearch listo para usar, con búsqueda concurrente por segmentos;</p></li><li><p>OpenSearch ootb: sin búsqueda concurrente de segmentos habilitada;</p></li><li><p>OpenSearch css: con búsqueda concurrente de segmentos habilitada</p></li></ul><p>Comencemos con algunos resultados detallados para cada conjunto de datos vectoriales probado:</p><h2>2,5 millones de vectores, 1536 dimensiones (openai_vector)</h2><p>Comenzando con la ruta más simple, pero también la más grande en términos de dimensiones, <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a>, que utiliza el <a href="https://huggingface.co/datasets/BeIR/nq">conjunto de datos NQ</a> enriquecido con incrustaciones generadas usando el <a href="https://openai.com/blog/new-and-improved-embedding-model">modelo text-embedding-ada-002</a> de OpenAI. Es el más simple ya que solo prueba KNN aproximado y tiene solo 5 tareas. Se prueba de forma independiente (sin indexar) así como junto con la indexación, y utilizando un solo cliente y 8 clientes simultáneos.</p><h3>Tareas</h3><ul><li><p><strong>standalone-search-knn-10-100-multiple-clients</strong>: búsqueda en 2,5 millones de vectores con 8 clientes simultáneamente, k: 10 y n:100</p></li><li><p><strong>standalone-search-knn-100-1000-multiple-clients</strong>: búsqueda en 2,5 millones de vectores con 8 clientes simultáneamente, k: 100 y n:1000</p></li><li><p><strong>standalone-search-knn-10-100-single-client</strong>: búsqueda en 2,5 millones de vectores con un solo cliente, k: 10 y n:100</p></li><li><p><strong>standalone-search-knn-100-1000-single-client</strong>: búsqueda en 2,5 millones de vectores con un solo cliente, k: 100 y n: 1000</p></li><li><p><strong>parallel-documents-indexing-search-knn-10-100</strong>: búsqueda en 2.5 millones de vectores mientras se indexan 100 000 documentos adicionales, k:10 y n:100</p></li></ul><p>El rendimiento promedio del p99 se describe a continuación:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5791848eb0c12fb/6a17d72925daab9cae08a09e/eea0b2b49c690baada3e09d6968e513bfffe51a9-1440x318.webp" alt="tabla openai_vector" /><p>Aquí observamos que Elasticsearch es de <strong>3x a 8x más rápido</strong> que OpenSearch al realizar la búsqueda vectorial junto con la indexación (por ej. lectura+escritura) con :10 y :100 y de <strong>2x a 3x más rápido</strong> sin indexar para los mismos k y n. Para :100 y :1000 (<em>standalone-search-knn-100-1000-single-client</em> y <em>standalone-search-knn-100-1000-multiple-clients</em> Elasticsearch es de <strong>2x a 7x</strong> más rápido que OpenSearch, en promedio.</p><p>Los resultados detallados muestran los casos exactos y los motores vectoriales comparados:</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 millones de vectores, 96 dimensiones (dense_vector)</h2><p>En <a href="https://github.com/elastic/rally-tracks/tree/master/dense_vector">dense_vector</a> con 10M vectores y 96 dimensiones. Se basa en el conjunto de datos de imágenes <a href="https://big-ann-benchmarks.com/">Yandex DEEP1B</a>. El conjunto de datos se crea a partir de los primeros 10 millones de vectores del archivo "sample data" llamado <code>learn.350M.fbin</code>. Las operaciones de búsqueda utilizan vectores de la búsqueda de archivos "query data".<code>public.10K.fbin</code>.</p><p>Tanto Elasticsearch como OpenSearch funcionan muy bien en este conjunto de datos, especialmente después de un <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html">force merge</a>, que generalmente se realiza en índices de solo lectura y es similar a desfragmentar el índice para tener una sola "tabla" en la que realizar la búsqueda.</p><h3>Tareas</h3><p>Cada tarea se prepara para 100 solicitudes y luego se miden 1000 solicitudes</p><ul><li><p><strong>knn-search-10-100</strong>: búsqueda en 10 millones de vectores, k: 10 y n:100</p></li><li><p><strong>knn-search-100-1000</strong>: búsqueda en 10 millones de vectores, k: 100 y n: 1000</p></li><li><p><strong>knn-search-10-100-force-merge</strong>: búsqueda en 10 millones de vectores después de una fusión forzada, k: 10 y n:100</p></li><li><p><strong>knn-search-100-1000-force-merge</strong>: búsqueda en 10 millones de vectores después de una fusión forzada, k: 100 y n:1000</p></li><li><p><strong>knn-search-100-1000-concurrent-with-indexing</strong>: búsqueda en 10 millones de vectores mientras también se actualiza <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/challenges/default.json#L76C36-L76C37">el 5 % del conjunto de datos</a>, k: 100 y n: 1000</p></li><li><p><strong>script-score-query</strong>: búsqueda KNN exacta de <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/queries.json">2000 vectores específicos</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4629d06af85eb96c/6a17d72c6864a423e7b685dc/174995e0a2156d86359cdb7aa446dfaae6312ea4-1440x316.webp" alt="dense_vector" /><p>Tanto Elasticsearch como OpenSearch tuvieron un buen desempeño para el KNN aproximado. Cuando el índice se fusiona (es decir, tiene un solo segmento) en <em>knn-search-100-1000-force-merge</em> y <em>knn-search-10-100-force-merge</em>, OpenSearch funciona mejor que los demás cuando se usan <code>nmslib</code> y <code>faiss</code>, aunque todos estén alrededor de 15 ms y todos muy cerca.</p><p>Sin embargo, cuando el índice tiene varios segmentos (una situación típica en la que un índice recibe actualizaciones de sus documentos) en <em>knn-search-10-100</em> y <em>knn-search-100-1000</em>, Elasticsearch mantiene la latencia en aproximadamente ~7 ms y ~16 ms, mientras que todos los demás motores de OpenSearch son más lentos.</p><p>También cuando se busca en el índice y se indexa en él al mismo tiempo (<em>knn-search-100-1000-concurrent-with-indexing</em>), Elasticsearch mantiene la latencia por debajo de 15 ms (a 13.8 ms), siendo casi <strong>4x más rápido</strong> que OpenSearch out-of-the-box (49.3 ms) y aún más rápido cuando se habilita la búsqueda concurrente por segmentos (17.9 ms), pero demasiado cerca para ser significativo.</p><p>En cuanto al KNN exacto, la diferencia es mucho mayor: Elasticsearch <strong>es 6 veces más rápido</strong> que OpenSearch (~260 ms vs ~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 millones de vectores, 768 dimensiones (so_vector)</h2><p>Esta <a href="https://github.com/elastic/rally-tracks/tree/master/so_vector">pista</a>, <code>so_vector</code>, se deriva de un <a href="https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z">volcado de publicaciones de StackOverflow descargadas</a> el 21 de abril de 2022. Solo contiene documentos de preguntas; se eliminaron todos los documentos que representan respuestas. Cada título de pregunta se codificó en un vector usando el modelo de transformador de oraciones <a href="https://huggingface.co/sentence-transformers/multi-qa-mpnet-base-cos-v1">multi-qa-mpnet-base-cos-v1</a>. Este conjunto de datos contiene los primeros 2 millones de preguntas.</p><p>A diferencia de la pista anterior, cada documento aquí contiene otros campos además de vectores para soportar características de prueba como KNN aproximado con filtrado y búsqueda híbrida. <code>nmslib</code> para OpenSearch está notablemente ausente en esta prueba ya que <a href="https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/#k-nn-search-with-filters">no admite filtros</a>.</p><h3>Tareas</h3><p>Cada tarea se calienta con 100 solicitudes y luego se miden 100 solicitudes. Tenga en cuenta que las tareas se agruparon por simplicidad, ya que la prueba contiene 16 tipos de búsqueda * 2 valores k diferentes * 3 valores n diferentes.</p><ul><li><p><strong>knn-10-50</strong>: búsqueda en 2 millones de vectores sin filtros, k:10 y n:50</p></li><li><p><strong>knn-10-50-filtered</strong>: búsqueda en 2 millones de vectores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">con filtros</a>, k:10 y n:50</p></li><li><p><strong>knn-10-50-after-force-merge</strong>: búsqueda en 2 millones de vectores con filtros y después de una fusión forzosa, k:10 y n:50</p></li><li><p><strong>knn-10-100</strong>: búsqueda en 2 millones de vectores sin filtros, k:10 y n:100</p></li><li><p><strong>knn-10-100-filtered</strong>: búsqueda en 2 millones de vectores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">con filtros</a>, k:10 y n:100</p></li><li><p><strong>knn-10-100-after-force-merge</strong>: búsqueda en 2 millones de vectores con filtros y luego de una fusión forzada, k: 10 y n: 100</p></li><li><p><strong>knn-100-1000</strong>: búsqueda en 2 millones de vectores sin filtros, k:100 y n:1000</p></li><li><p><strong>knn-100-1000-filtered</strong>: búsqueda en 2 millones de vectores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">con filtros</a>, k:100 y n:1000</p></li><li><p><strong>knn-100-1000-after-force-merge</strong>: búsqueda en 2 millones de vectores con filtros y luego de una fusión forzada, k:100 y n:1000</p></li><li><p><strong>exact-knn</strong>: búsqueda de KNN exacto <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json#L56">con y sin filtros</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b44e1306af35877/6a17d72f577262aca11bca3e/d4ed2982d55370cad4b2048b23ce97caa55017c0-1440x316.webp" alt="tabla so_vector" /><p>Elasticsearch es <strong>consistentemente más rápido</strong> que OpenSearch de manera inmediata en esta prueba, solo en dos casos OpenSearch es más rápido, y no por mucho (<em>knn-10-100</em> y <em>knn-100-1000</em>). Las tareas que involucran <em>knn-10-50</em>, <em>knn-10-100</em> y <em>knn-100-1000</em> en combinación con filtros muestran una diferencia de hasta <strong>7 veces</strong> (112 ms versus 803 ms).</p><p>El rendimiento de ambas soluciones parece igualarse después de un "force merge" (fusión forzada), lógicamente, como lo demuestran <em>knn-10-50-after-force-merge</em>, <em>knn-10-100-after-force-merge</em> y <em>knn-100-1000-after-force-merge.</em> En esas tareas, <code>faiss</code> es más rápido.</p><p>Como mencionamos, el rendimiento para Exact KNN es muy diferente, ya que Elasticsearch fue <strong>13 veces más rápido</strong> que OpenSearch esta vez (~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 y Lucene como claros vencedores</h2><p>En Elastic, estamos innovando incansablemente Apache Lucene y Elasticsearch para garantizar que podamos proporcionar la base de datos vectorial de primer nivel para casos de uso de búsqueda y recuperación, incluido RAG (Retrieval Augmented Generation). Nuestros últimos avances han aumentado significativamente el rendimiento, haciendo que la búsqueda vectorial <a href="https://search-labs.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">sea más rápida y eficiente en cuanto a espacio</a> que antes, basándose en las mejoras de Lucene 9.10. En este blog, se presentó un estudio que muestra que al comparar versiones actualizadas, Elasticsearch es hasta 12 veces más rápido que OpenSearch.</p><p>Vale la pena señalar que ambos productos usan la misma versión de Lucene (<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-8.14.0.html">Notas de lanzamiento de Elasticsearch 8.14</a> y <a href="https://github.com/opensearch-project/OpenSearch/blob/2.14/release-notes/opensearch.release-notes-2.14.0.md">Notas de lanzamiento de OpenSearch 2.14</a>).</p><p>El ritmo de innovación en Elastic ofrecerá aún más, no solo para nuestros clientes locales y de Elastic Cloud, sino también para aquellos que utilizan nuestra <a href="https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">plataforma sin estado</a>. Las características como el soporte para la <a href="https://www.elastic.co/search-labs/blog/int4-scalar-quantization-in-lucene">cuantificación escalar a int4</a> se ofrecerán con pruebas rigurosas para garantizar que los clientes puedan utilizar estas técnicas sin una caída significativa en la recuperación, similar a <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">nuestras pruebas para int8</a>.</p><p>La eficiencia de la búsqueda vectorial se está convirtiendo en una característica no negociable en los motores de búsqueda modernos debido a la proliferación de aplicaciones de inteligencia artificial y machine learning. Para las organizaciones que buscan un motor de búsqueda poderoso capaz de mantenerse al día con las demandas de datos vectoriales de alto volumen y alta complejidad, Elasticsearch es la respuesta definitiva.</p><p>Ya sea que quieres expandir una plataforma establecida o iniciar nuevos proyectos, integrar Elasticsearch para las necesidades de búsqueda vectorial es un movimiento estratégico que generará beneficios tangibles a largo plazo. Con su ventaja de rendimiento comprobada, Elasticsearch está a punto de apuntalar la próxima ola de innovaciones en búsqueda.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison</guid>
    <category><![CDATA[Base de datos vectorial]]></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>