<?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/pt/search-labs/author/ugo-sangiorgi</link>
    </image>
    <link>https://www.elastic.co/pt/search-labs/author/ugo-sangiorgi</link>
    <atom:link href="https://www.elastic.co/pt/search-labs/rss/author/ugo-sangiorgi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[pt]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 05:13:50 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch BBQ vs. OpenSearch FAISS: Comparação de desempenho de pesquisa vetorial]]></title>
    <description><![CDATA[Uma comparação de desempenho entre o Elasticsearch BBQ e o OpenSearch FAISS.]]></description>
    <content:encoded><![CDATA[<p><strong>Pesquisa vetorial com quantização binária: Elasticsearch com BBQ é 5x mais rápido que OpenSearch com FAISS</strong>. A Elastic recebeu solicitações da nossa comunidade para esclarecer as diferenças de desempenho entre o Elasticsearch e o OpenSearch, particularmente no âmbito da Pesquisa Semântica/Pesquisa Vetorial, por isso conduzimos esses testes de desempenho para fornecer comparações claras e baseadas em dados.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8792b5284e7a553/6a1709b9961e69a084c4cee6/7f4f8d08f7bee188423e4e65f0caefc7e34f0355-1600x681.png" alt="Elasticsearch BBQ vs. OpenSearch FAISS - Comparação de velocidade e taxa de transferência (recall)" /><h2>Confronto de quantização binária</h2><p>Armazenar vetores de alta dimensão em sua forma original pode exigir muita memória. Técnicas de quantização comprimem esses vetores em uma representação compacta, reduzindo drasticamente o consumo de memória. A busca então opera no espaço comprimido, o que reduz a complexidade computacional e torna as buscas mais rápidas, especialmente em grandes conjuntos de dados.</p><p>A Elastic está empenhada em fazer do Lucene um mecanismo vetorial de alto desempenho. Introduzimos <a href="https://www.elastic.co/pt/search-labs/blog/better-binary-quantization-lucene-elasticsearch">a Quantização Binária Aprimorada</a> (BBQ) no Elasticsearch 8.16, com base no Lucene, e aprimoramos ainda mais nas versões 8.18 e 9.0. O BBQ é baseado em uma nova abordagem de <a href="https://www.elastic.co/pt/search-labs/blog/optimized-scalar-quantization-elasticsearch">quantização escalar</a> que reduz as dimensões de ponto flutuante de 32 bits, proporcionando uma redução de memória de aproximadamente 95%, mantendo uma alta qualidade de classificação.</p><p>O OpenSearch, por outro lado, usa vários mecanismos de vetores: nmslib (agora obsoleto), Lucene e FAISS. Em um <a href="https://www.elastic.co/pt/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison">blog anterior</a>, comparamos o Elasticsearch e o OpenSearch para pesquisa vetorial. Usamos três conjuntos de dados diferentes e testamos diferentes combinações de mecanismos e configurações em ambos os produtos.</p><p>Este blog se concentra nos algoritmos de quantização binária atualmente disponíveis em ambos os produtos. Testamos o Elasticsearch com BBQ e o OpenSearch com <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">a Quantização Binária do FAISS</a> usando a trilha Rally <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> .</p><p>O objetivo principal era avaliar o desempenho de ambas as soluções sob o mesmo nível de recall. O que significa <em>recall</em> ? Recall é uma métrica que mede quantos resultados relevantes são recuperados com sucesso por um sistema de pesquisa.</p><p>Nesta avaliação, recall@k é particularmente importante, onde <em>k</em> representa o número de resultados principais considerados. <strong>Recall@10</strong>, <strong>Recall@50 e Recall@100</strong> medem, portanto, quantos dos resultados verdadeiramente relevantes aparecem nos 10, 50 e 100 principais itens recuperados, respectivamente. A recordação é expressa em uma escala de 0 a 1 (ou precisão de 0% a 100%). E isso é importante porque estamos falando de KNN Aproximado (ANN) e não de KNN Exato, onde a recordação é sempre 1 (100%).</p><p>Para cada valor de <em>k</em> também especificamos <em>n, </em>que é o número de candidatos considerados antes de aplicar a classificação final. Isso significa que para Recall@10, Recall@50 e Recall@100, o sistema primeiro recupera <em>n</em> candidatos usando o algoritmo de quantização binária e depois os classifica para determinar se os <em>k</em> principais resultados contêm os itens relevantes esperados.</p><p>Ao controlar <em>n</em>, podemos analisar o trade-off entre eficiência e precisão. Um <em>n</em> mais alto normalmente <strong>aumenta</strong> a recuperação, pois mais candidatos estão disponíveis para classificação, mas também <strong>aumenta</strong> a latência e<strong> diminui </strong>a taxa de transferência. Por outro lado, um <em>n</em> menor acelera a recuperação, mas pode reduzir a recordação se poucos candidatos relevantes forem incluídos no conjunto inicial.</p><p>Nesta comparação, o Elasticsearch demonstrou menor latência e maior rendimento que o OpenSearch em configurações idênticas.</p><h2>Metodologia</h2><p>A configuração completa, juntamente com os scripts do Terraform, os manifestos do Kubernetes e a trilha Rally específica estão disponíveis neste <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq">repositório</a> em <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>Assim como nos benchmarks anteriores, usamos um cluster Kubernetes composto por:</p><ul><li><p>1 pool de nós para Elasticsearch 9.0 com 3 máquinas <code>e2-standard-32</code> (128 GB de RAM e 32 CPUs)</p></li><li><p>1 pool de nós para OpenSearch 2.19 com 3 máquinas <code>e2-standard-32</code> (128 GB de RAM e 32 CPUs)</p></li><li><p>1 pool de nós para Rally com 2 máquinas <code>e2-standard-4</code> (16 GB de RAM e 4 CPUs)</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt934e988e96a5849f/6a1709bbacf08838f9be9ac1/169bb6033f6eebfd1b177b3446bf916fde4ee5c5-1600x856.png" alt="Configuração da metodologia Elasticsearch BBQ vs Opensearch FAISS" /><p>Configuramos um cluster Elasticsearch versão 9.0 e um cluster OpenSearch versão 2.19.</p><p>Tanto o Elasticsearch quanto o OpenSearch foram testados com exatamente a mesma configuração: usamos o Rally track <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> com <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/commit/b97d5d95c22c8cf862f2030964524bdd156a5da3">algumas modificações</a> , que usa 2,5 milhões de documentos do <a href="https://huggingface.co/datasets/BeIR/nq">conjunto de dados NQ</a> enriquecidos com embeddings gerados usando <a href="https://openai.com/blog/new-and-improved-embedding-model">o modelo text-embedding-ada-002</a> do OpenAI.</p>{
  "source-file": "open_ai_corpus-initial-indexing.json.bz2",
  "document-count": 2580961,
  "compressed-bytes": 32076749416,
  "uncompressed-bytes": 90263571686
}<p>Os resultados relatam a latência e a taxa de transferência medidas em diferentes níveis de recall (recall@10, recall@50 e recall@100) usando 8 clientes simultâneos para executar operações de pesquisa. Usamos um único fragmento e nenhuma réplica.</p><p>Executamos as seguintes combinações de kn-rescore, por exemplo 10-2000-2000, ou <em>k:10</em>, <em>n:2000</em> e <em>rescore:2000</em> recuperariam os k (10) principais sobre n candidatos (2000) aplicando uma rescore sobre 2000 resultados (o que é equivalente a um “fator de sobreamostragem” de 1). Cada pesquisa foi executada 10.000 vezes, com 1.000 pesquisas como aquecimento:</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>Lembre-se @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 o benchmark, os manifestos do Kubernetes para rally-elasticsearch e rally-opensearch têm todas as variáveis relevantes externalizadas em um ConfigMap, disponível <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-es-bq.yml">aqui</a> (ES) e <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-os-bq.yml">aqui</a> (OS). O parâmetro <em>search_ops</em> pode ser personalizado para testar qualquer combinação de k, n e rescore.</p><h3>Configuração do 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>Configuração do índice Opensearch</h3><p>As variáveis do ConfigMap são então usadas na configuração do índice, alguns parâmetros são deixados inalterados. A quantização de 1 bit no OpenSearch é configurada <a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">definindo o nível de compressão como “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>Configuração do 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>Configuração do índice do 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>Há várias maneiras de interpretar os resultados. Tanto para latência quanto para taxa de transferência, criamos um gráfico simplificado e detalhado em cada nível de recall. É fácil ver diferenças se considerarmos “quanto maior, melhor” para cada métrica. No entanto, a latência é negativa (quanto menor, melhor), enquanto a taxa de transferência é positiva. Para os gráficos simplificados, usamos <strong>(recall / latência) * 10000 </strong>(chamado simplesmente de “velocidade”) e<strong> recall * throughput</strong>, então ambas as métricas significam que mais velocidade e mais throughput são melhores. Vamos lá.</p><h3>Recall @ 10 - simplificado</h3><p>Nesse nível de recall, o Elasticsearch BBQ é até <strong>5x mais rápido </strong>(3,9x mais rápido em média) e tem <strong>3,2x mais taxa de transferência</strong> em média do que o OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3de6b3460127a8ae/6a1709bcb339d55975769f6f/d580ad53e8974bd3aa75957c413a0136c4e465c5-1600x681.png" alt="O Elasticsearch BBQ é até 5 vezes mais rápido (3,9 vezes mais rápido em média) e tem 3,2 vezes mais capacidade de processamento em média do que o OpenSearch FAISS em termos de velocidade e capacidade de processamento (Recall@10)." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd47045013cac5e9d/6a1709be0e2e49599a41a088/18edce667fe36ab95033264ef8df6f352dda2425-2044x866.png" alt="O Elasticsearch BBQ é até 5 vezes mais rápido (3,9 vezes mais rápido em média) e tem 3,2 vezes mais capacidade de processamento em média do que o OpenSearch FAISS." /><h4>Recall @ 10 - Detalhado</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ecb02d4a2967dbd/6a1709bf14b270c04fe3c5c6/a7459b87e679f4ad963d0e2f1685499b40f6f050-1600x799.png" alt="Comparação detalhada da latência recall@10 entre Elasticsearch BBQ e Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt182da309ad6cfd39/6a1709c166c4f99077f8bfd8/c6036f55a13377654d296eb3148c7199e1965475-1600x799.png" alt="Comparação detalhada do desempenho de recall@10 entre Elasticsearch BBQ e Opensearch FAISS." /><p></p><p>tarefa</p><p>latência.média</p><p>rendimento.média</p><p>recuperação média</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>11h00</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>Recall @ 50 - simplificado</h3><p>Nesse nível de recall, o Elasticsearch BBQ é <strong>até 5x mais rápido</strong> (4,2x mais rápido em média) e tem <strong>3,9x mais rendimento</strong> em médiado que o OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt486683f2c7a1d677/6a1709c2a6c2b995bde796a3/3189ffb330948b35854eeea9ae317d4846c14972-1600x681.png" alt="Comparação de desempenho vetorial Recal @50: Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba830c6741784682/6a1709c4a292990627d00ff7/607383d674dcf0b8f94bfb1a450063f52fcbeb15-2060x876.png" alt="O Elasticsearch BBQ é até 5 vezes mais rápido (4,2 vezes mais rápido em média) e tem 3,9 vezes mais capacidade de processamento em média do que o OpenSearch FAISS." /><h4>Resultados detalhados - Recall @ 50</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt821775e7f87e5ede/6a1709c6a6c2b90af3e796a7/ebfffe0b776aad31dd03d315cfbf5aa098b41226-1600x789.png" alt="Resultados de latência do Recall@50 Elasticsearch BBQ e Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4f47784ed1017c15/6a1709c7e8fbce0fbe39fbf5/ae20cf870a65c400a2112bbad62eb56e244f549a-1600x799.png" alt="Resultados de throughput do Elasticsearch BBQ e Opensearch FAISS no Recall@50" /><p></p><p>Tarefa</p><p>Média de latência</p><p>Média de rendimento</p><p>Recall médio</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>17h15</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>Recall @ 100</h3><p>Nesse nível de recall, o Elasticsearch BBQ é <strong>até 5x mais rápido </strong>(média de 4,6x mais rápido) e tem <strong>3,9x mais taxa de transferência </strong>em média do que o OpenSearch FAISS.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt380eb9165343a7b3/6a1709c9acf0882669be9ac5/d3f29db64cbde9956de1fa3ae64a75f15141a2bb-1600x681.png" alt="Relembrando os resultados do Elasticsearch BBQ VS Opensearch FAISS @100" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt505ce8aa70898390/6a1709cb1949f73a37e7a9bb/10aff7f8c61fdac895b9ba9c5342baf239ba3ffc-2072x864.png" alt="Comparação de desempenho de latência e taxa de transferência do Elasticsearch BBQ e do Opensearch FAISS" /><h4>Resultados detalhados - Recall @ 100</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2a73e29940e9d6b/6a1709cccf4f257615b2d138/8790fdf9512b850447f6875fb69969f6f1d4da5f-1600x799.png" alt="Resultados detalhados de latência - Recall @ 100 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c91ca21da03d96/6a1709ce0c4857d3fc01aa39/d47032fac6c288cd4eedd9f25001e417b2fa9d65-1600x787.png" alt="Resultados detalhados de desempenho - Recall @ 100 Elasticsearch BBQ vs Opensearch FAISS." /><p></p><p>tarefa</p><p>latência.média</p><p>rendimento.média</p><p>recuperação média</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>Melhorias no churrasco</h2><p>BBQ percorreu um longo caminho desde seu primeiro lançamento. No Elasticsearch 8.16, para fins de comparação, incluímos uma execução de benchmark da versão 8.16 junto com a atual, e podemos ver como a recuperação e a latência melhoraram desde então.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f1f7ae1bb425a3a/6a1709cf67045bde8e45c192/45a0acfe5985bff28ccada76ec4eca190fe65f72-1600x799.png" alt="Melhorias na latência de recall do Elasticsearch 9.0 BBQ comparadas com o Elasticsearch 8.16 BBQ" /><p>No Elasticsearch 8.18 e 9.0, reescrevemos o algoritmo principal para quantizar os vetores. Então, embora o BBQ na versão 8.16 fosse bom, as versões mais recentes são ainda melhores. Você pode ler sobre isso <a href="https://www.elastic.co/pt/search-labs/blog/optimized-scalar-quantization-elasticsearch">aqui</a> e <a href="https://www.elastic.co/pt/search-labs/blog/scalar-quantization-optimization">aqui</a>. Em resumo, cada vetor é quantizado individualmente por meio de quantis escalares otimizados. Como resultado, os usuários se beneficiam de maior precisão na pesquisa de vetores sem comprometer o desempenho, tornando a recuperação de vetores do Elasticsearch ainda mais poderosa.</p><h2>Conclusão</h2><p>Nesta comparação de desempenho entre o Elasticsearch BBQ e o OpenSearch FAISS, o Elasticsearch supera significativamente o OpenSearch para pesquisa vetorial, alcançando velocidades de consulta até 5x mais rápidas e uma taxa de transferência 3,9x maior, em média, em vários níveis de recuperação.</p><p>As principais descobertas incluem:</p><ul><li><p><strong>Recall@10</strong>: O Elasticsearch BBQ é até 5x mais rápido (3,9x mais rápido em média) e tem 3,2x mais taxa de transferência em média em comparação ao OpenSearch FAISS.</p></li><li><p><strong>Recall@50</strong>: O Elasticsearch BBQ é até 5x mais rápido (4,2x mais rápido em média) e tem 3,9x mais taxa de transferência em média em comparação ao OpenSearch FAISS.</p></li><li><p><strong>Recall@100</strong>: O Elasticsearch BBQ é até 5x mais rápido (4,6x mais rápido em média) e tem 3,9x mais taxa de transferência em média em comparação ao OpenSearch FAISS.</p></li></ul><p>Esses resultados destacam as vantagens de eficiência e desempenho do Elasticsearch BBQ, particularmente em cenários de pesquisa vetorial de alta dimensão. A técnica Better Binary Quantization (BBQ), introduzida no Elasticsearch 8.16, proporciona redução substancial de memória (~95%) enquanto mantém alta qualidade de classificação, tornando-a uma escolha superior para aplicações de pesquisa vetorial em larga escala.</p><p>Na Elastic, estamos inovando incansavelmente para melhorar o Apache Lucene e o Elasticsearch para fornecer o melhor banco de dados vetorial para casos de uso de pesquisa e recuperação, incluindo RAG (Retrieval Augmented Generation). Nossos <a href="https://www.elastic.co/pt/search-labs/blog/optimized-scalar-quantization-elasticsearch">avanços recentes</a> aumentaram drasticamente o desempenho, tornando a pesquisa vetorial mais rápida e mais eficiente em termos de espaço do que antes, aproveitando os ganhos do Lucene 10. Este blog é outra ilustração dessa inovação.</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[Banco de dados vetorial]]></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 x OpenSearch: comparação de desempenho da busca vetorial]]></title>
    <description><![CDATA[O Elasticsearch é, de imediato, de 2 a 12 vezes mais rápido que o OpenSearch para busca vetorial]]></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: o Elasticsearch é até 12x mais rápido</a> - Nós, da Elastic, recebemos inúmeras solicitações da nossa comunidade para esclarecer as diferenças de desempenho entre o Elasticsearch e o OpenSearch, particularmente no reinos da busca semântica / busca vetorial. Por isso, realizamos esse teste de desempenho para fornecer uma comparação clara e orientada por dados — sem ambiguidade, apenas fatos diretos para informar nossos usuários. Os resultados mostram que o <strong>Elasticsearch é até 12x mais rápido</strong> do que o OpenSearch para busca vetorial e, portanto, requer menos recursos computacionais. Isso reflete o foco da Elastic em consolidar o Lucene como o melhor banco de dados vetorial para casos de uso de busca e recuperação.</p><p>A busca vetorial está revolucionando a maneira como realizamos buscas de similaridade, principalmente em campos como IA e machine learning. Com a crescente adoção de modelos de incorporação vetorial, a capacidade de buscar com eficiência milhões de vetores de alta dimensão torna-se crítica.</p><p>Quando se trata de melhorar bancos de dados vetoriais, a Elastic e o OpenSearch adotaram abordagens notavelmente diferentes. A Elastic investiu muito na otimização do Apache Lucene junto com o Elasticsearch para elevá-los como a melhor opção para aplicações de busca vetorial. Em contraste, o OpenSearch ampliou seu foco, integrando outras implementações de busca vetorial e explorando além do escopo do Lucene. Nosso foco no Lucene é estratégico, permitindo-nos fornecer suporte altamente integrado na nossa versão do Elasticsearch, resultando em um conjunto aprimorado de recursos em que cada componente complementa e amplifica as capacidades do outro.</p><p>Este blog apresenta uma comparação detalhada entre o Elasticsearch 8.14 e o OpenSearch 2.14, levando em conta diferentes configurações e motores vetoriais. Nesta análise de desempenho, o Elasticsearch provou ser a plataforma superior para operações de busca vetorial, e os <a href="https://www.elastic.co/search-labs/blog/vector-similarity-computations-ludicrous-speed">próximos recursos</a> ampliarão as diferenças ainda mais <a href="https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">significativamente</a>. Quando comparado com o OpenSearch, ele se destacou em todas as faixas de benchmark — <strong>oferecendo desempenho de 2x a 12x mais rápido em média</strong>. Isso ocorreu em situações que usam quantidades e dimensões vetoriais variadas, incluindo <code>so_vector</code> (2 milhões de vetores, 768D), <code>openai_vector</code> (2,5 milhões de vetores, 1536D) e <code>dense_vector</code> (10 milhões de vetores, 96D), todos disponíveis <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance">neste repositório</a> junto com os scripts do Terraform para provisão de toda a infraestrutura necessária nos manifestos do Google Cloud e do Kubernetes para executar os testes.</p><p>Os resultados detalhados neste blog complementam os resultados de um <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap">estudo publicado antes e validado por terceiros</a> que mostra que o Elasticsearch é 40%–140% mais rápido do que o OpenSearch nas operações de análise de busca mais comuns: consulta de texto, ordenação, intervalo, histograma de data e filtro de termos. Agora podemos adicionar outro diferenciador: busca vetorial.</p><h2>Até 12x mais rápido, pronto para uso</h2><p>Nossos benchmarks focados nos quatro conjuntos de dados vetoriais envolveram buscas de KNN aproximado e KNN exato, considerando diferentes tamanhos, dimensões e configurações, totalizando <code>40.189.820</code> solicitações de busca não armazenadas em cache. Os resultados: <strong>o Elasticsearch é até 12 vezes mais rápido</strong> do que o OpenSearch para busca vetorial e, portanto, requer menos recursos computacionais.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34b83c6eba3bcb6e/6a17d727dbb4ff18d6fb54fb/cdb26e91f085b90e9b12aeb8fee53b04d365ecae-1440x1156.webp" alt="média p90" /><p>Figura 1: Tarefas agrupadas para ANN e KNN Exato em diferentes combinações no Elasticsearch e OpenSearch.</p><p>Os grupos como <code>knn-10-100</code> significam uma busca KNN com  e . Na busca vetorial HNSW,  determina o número de vizinhos mais próximos a serem recuperados para um vetor de consulta. Especifica quantos vetores semelhantes devem ser encontrados como resultado.  define o número de vetores candidatos a serem recuperados em cada segmento. Mais candidatos podem melhorar a precisão, mas exigem maiores recursos computacionais.</p><p>Também testamos com diferentes técnicas de quantização e aproveitamos otimizações específicas do mecanismo; os resultados detalhados para cada trilha, tarefa e mecanismo de vetor estão disponíveis abaixo.</p><h2>KNN exato e KNN aproximado</h2><p>Ao lidar com conjuntos de dados e casos de uso variados, a abordagem correta para busca vetorial será diferente. Neste blog, todas as tarefas declaradas como <code>knn-*</code> como <code>knn-10-100</code> usam <strong>KNN aproximado</strong> e <code>script-score-*</code> se referem ao <strong>KNN exato</strong>, mas qual é a diferença entre elas e por que são importantes?</p><p>Em essência, se você estiver lidando com conjuntos de dados mais substanciais, o método preferido é o Approximate K-Nearest Neighbor (ANN) devido à escalabilidade superior. Para conjuntos de dados mais modestos que podem exigir um processo de filtragem, o método Exact K-Nearest Neighbor (KNN) é ideal.</p><p>O KNN exato utiliza um método de força bruta, calculando a distância entre um vetor e todos os outros vetores no conjunto de dados. Em seguida, classifica essas distâncias para encontrar os  vizinhos mais próximos. Embora esse método garanta uma correspondência exata, ele enfrenta desafios de escalabilidade para conjuntos de dados grandes e de alta dimensão. No entanto, há muitos casos em que o KNN exato é necessário:</p><ul><li><p><strong>Reclassificação</strong>: em casos que envolvem buscas lexicais ou semânticas seguidas de reclassificação baseada em vetores, o KNN exato é essencial. Por exemplo, em um mecanismo de busca de produtos, os resultados de busca iniciais podem ser filtrados com base em consultas textuais (por exemplo, palavras-chave, categorias) e, em seguida, os vetores associados aos itens filtrados são usados para uma avaliação de similaridade mais precisa.</p></li><li><p><strong>Personalização</strong>: ao lidar com um grande número de usuários, cada um representado por um número relativamente pequeno (como 1 milhão) de vetores distintos, a ordenação do índice por metadados específicos do usuário (por exemplo, user_id) e a pontuação de força bruta com vetores torna-se eficiente. Essa abordagem permite recomendações personalizadas ou entrega de conteúdo com base em comparações precisas de vetores adaptadas às preferências individuais do usuário.</p></li></ul><p>O Exact KNN, portanto, garante que a classificação final e as recomendações baseadas na similaridade vetorial sejam precisas e adaptadas às preferências do usuário.</p><p>O KNN aproximado (ou ANN), por outro lado, utiliza métodos para deixar a busca de dados mais rápida e eficiente do que o KNN exato, principalmente em conjuntos de dados grandes e de alta dimensão. Em vez de uma abordagem de força bruta, que mede a distância exata mais próxima entre uma consulta e todos os pontos, gerando desafios de computação e redimensionamento, a ANN utiliza certas técnicas para reestruturar eficientemente os índices e as dimensões dos vetores buscáveis no conjunto de dados. Embora isso possa causar uma pequena imprecisão, aumenta significativamente a velocidade do processo de busca, sendo uma alternativa eficaz para lidar com grandes conjuntos de dados.</p><p>Neste blog, todas as tarefas declaradas como <code>knn-*</code>, como <code>knn-10-100</code>, usam <strong>KNN aproximado</strong> e <code>script-score-*</code> referem-se a <strong>KNN exato</strong>.</p><h2>Metodologia de teste</h2><p>Embora o Elasticsearch e o OpenSearch sejam semelhantes em termos de API para operações de busca do BM25, já que o último é uma bifurcação do primeiro, não é o caso do Vector Search, que foi introduzido após o fork. O OpenSearch adotou uma abordagem diferente do Elasticsearch quando se trata de algoritmos, introduzindo dois outros mecanismos — <code>nmslib</code> e <code>faiss</code> — além do <code>lucene</code>, cada um com configurações e limitações específicas (por exemplo, <code>nmslib</code> no OpenSearch não permite filtros, um recurso essencial para muitos casos de uso).</p><p>Todos os três mecanismos usam o algoritmo Hierarchical Navigable Small World (HNSW), que é eficiente para busca aproximada do vizinho mais próximo e principalmente poderoso ao lidar com dados de alta dimensão. É importante observar que o <code>faiss</code> também aceita um segundo algoritmo, <code>ivf</code>, mas como ele requer pré-treinamento no conjunto de dados, vamos nos concentrar exclusivamente no HNSW. A ideia de núcleo do HNSW é organizar os dados em várias camadas de gráficos conectados, com cada camada representando uma granularidade diferente do conjunto de dados. A busca começa na camada superior com a visualização mais grosseira e avança para camadas cada vez mais finas até chegar ao nível básico.</p><p>Ambos os mecanismos de busca foram testados sob condições idênticas em um ambiente controlado para garantir condições de teste justas. O método aplicado é semelhante a <a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap#testing-methodology">esta comparação de desempenho já publicada</a>, com pools de node dedicados para Elasticsearch, OpenSearch e Rally. O <a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/main/terraform/main.tf">script terraform</a> está disponível (junto com todas as fontes) para fazer a provisão de um cluster Kubernetes com:</p><ul><li><p>1 Node pool para Elasticsearch com 3 máquinas <code>e2-standard-32</code> (128 GB de RAM e 32 CPUs)</p></li><li><p>1 Node pool para OpenSearch com 3 máquinas <code>e2-standard-32</code> (128 GB de RAM e 32 CPUs)</p></li><li><p>1 Node pool para Rally com 2 <code>t2a-standard-16</code> máquinas (64GB de RAM e 16 CPUs)</p></li></ul><p>Cada "trilha" (ou teste) foi executada 10 vezes em cada configuração, que incluía diferentes motores, diferentes configurações e diferentes tipos de vetor. As trilhas têm tarefas que se repetem entre 1.000 e 10.000 vezes, dependendo da trilha. Se uma das tarefas em uma trilha falhou, por exemplo, devido a um tempo-limite de rede, então todas as tarefas foram descartadas, de modo que todos os resultados representam trilhas que começaram e terminaram sem problemas. Todos os resultados dos testes são validados estatisticamente, garantindo que as melhorias não sejam coincidência.</p><h2>Resultados detalhados</h2><p>Por que comparar usando o 99º percentil e não a latência média? Considere um exemplo hipotético de preços médios de casas em um determinado bairro. O preço médio pode indicar uma área cara, mas, em uma inspeção mais detalhada, pode ser que a maioria das casas tenha um valor muito mais baixo, com apenas algumas propriedades de luxo inflando o valor médio. Isso ilustra como o preço médio pode não representar com precisão todo o espectro de valores das casas na área. Isso é semelhante a examinar os tempos de resposta, onde a média pode ocultar problemas críticos.</p><h4>Tarefas</h4><ul><li><p>KNN aproximado com k:10 n:50</p></li><li><p>KNN Aproximado com k:10 n:100</p></li><li><p>KNN aproximado com k:100 n:1000</p></li><li><p>KNN aproximado com k:10 n:50 e filtros de palavras-chave</p></li><li><p>KNN aproximado com k:10 n:100 e filtros de palavras-chave</p></li><li><p>KNN aproximado com k:100 n:1000 e filtros de palavras-chave</p></li><li><p>KNN aproximado com k:10 n:100 em conjunto com indexação</p></li><li><p>KNN exato (pontuação do script)</p></li></ul><h4>Motores vetoriais</h4><ul><li><p><code>lucene</code> no Elasticsearch e OpenSearch, ambos na versão 9.10</p></li><li><p><code>faiss</code> no OpenSearch</p></li><li><p><code>nmslib</code> no OpenSearch</p></li></ul><h4>Tipos de vetor</h4><ul><li><p><code>hnsw</code> no Elasticsearch e OpenSearch</p></li><li><p><code>int8_hnsw</code> no Elasticsearch (HNSW com quantização automática de 8 bits: <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">link</a>)</p></li><li><p><code>sq_fp16 hnsw </code>no OpenSearch (HNSW com quantização automática de 16 bits: <a href="https://opensearch.org/docs/2.14/search-plugins/knn/knn-vector-quantization#faiss-16-bit-scalar-quantization">link</a>)</p></li></ul><h4>Busca de segmento simultânea e pronta para uso</h4><p>Como você provavelmente sabe, o Lucene é uma biblioteca de mecanismo de busca de texto de alto desempenho escrita em Java que serve como espinha dorsal para muitas plataformas de busca, como Elasticsearch, OpenSearch e Solr. No núcleo, o Lucene organiza os dados em segmentos, que são essencialmente índices independentes que permitem ao Lucene executar buscas com mais eficiência. Portanto, quando você emite uma busca para qualquer mecanismo de busca baseado em Lucene, sua busca acabará sendo executada nesses segmentos, sequencialmente ou em paralelo.</p><p>O OpenSearch introduziu a busca simultânea por segmentos como uma opção e não a utiliza como padrão. Você deve habilitá-la usando uma configuração especial de índice <code>index.search.concurrent_segment_search.enabled</code> conforme detalhado <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/">aqui</a>, com algumas <a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/#other-considerations">limitações</a>.</p><p>O Elasticsearch, por outro lado, busca em segmentos simultaneamente <a href="https://github.com/elastic/elasticsearch/pull/101230">prontos para uso</a>; portanto, as comparações que fazemos neste blog levarão em consideração, além dos diferentes mecanismos vetoriais e tipos de vetores, também as diferentes configurações:</p><ul><li><p>Elasticsearch ootb: Elasticsearch pronto para uso, com busca de segmento simultânea;</p></li><li><p>OpenSearch ootb: sem busca de segmento simultânea habilitada;</p></li><li><p>OpenSearch css: com busca de segmento simultânea habilitada</p></li></ul><p>Agora vamos nos aprofundar em alguns resultados detalhados para cada conjunto de dados vetoriais testado:</p><h2>2,5 milhões de vetores, 1536 dimensões (openai_vector)</h2><p>Começando com a faixa mais simples, mas também a maior em termos de dimensões, <a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> - que usa o <a href="https://huggingface.co/datasets/BeIR/nq">conjunto de dados NQ</a> enriquecido com embeddings gerados usando o <a href="https://openai.com/blog/new-and-improved-embedding-model">modelo text-embedding-ada-002</a> do OpenAI. É o mais simples, pois testa apenas o KNN aproximado e tem apenas 5 tarefas. Ele testa de forma autônoma (sem indexação) e junto com a indexação, usando um único cliente e 8 clientes simultâneos.</p><h3>Tarefas</h3><ul><li><p><strong>standalone-search-knn-10-100-multiple-clients</strong>: buscando em 2,5 milhões de vetores com 8 clientes simultaneamente, k: 10 e n:100</p></li><li><p><strong>standalone-search-knn-100-1000-multiple-clients</strong>: buscando em 2,5 milhões de vetores com 8 clientes simultaneamente, k: 100 e n:1000</p></li><li><p><strong>standalone-search-knn-10-100-single-client</strong>: buscando em 2,5 milhões de vetores com um único cliente, k: 10 e n:100</p></li><li><p><strong>standalone-search-knn-100-1000-single-client</strong>: buscando em 2,5 milhões de vetores com um único cliente, k: 100 e n:1000</p></li><li><p><strong>parallel-documents-indexing-search-knn-10-100</strong>: buscando em 2,5 milhões de vetores e, ao mesmo tempo, indexando 100.000 documentos adicionais, k:10 e n:100</p></li></ul><p>O desempenho médio do p99 é descrito abaixo:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5791848eb0c12fb/6a17d72925daab9cae08a09e/eea0b2b49c690baada3e09d6968e513bfffe51a9-1440x318.webp" alt="tabela openai_vector" /><p>Aqui, observamos que o Elasticsearch é entre <strong>3x-8x mais rápido</strong> do que o OpenSearch ao realizar a busca vetorial junto com a indexação (i.e. leitura+escrita) com :10 e :100 e <strong>2x-3x mais rápido</strong> sem indexação para os mesmos k e n. Para :100 e :1000 (<em>standalone-search-knn-100-1000-single-client</em> e <em>standalone-search-knn-100-1000-multiple-clients</em> ), o Elasticsearch é <strong>2x a 7x</strong> mais rápido que o OpenSearch, em média.</p><p>Os resultados detalhados mostram os casos exatos e os mecanismos vetoriais 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 milhões de vetores, 96 dimensões (dense_vector)</h2><p>Em <a href="https://github.com/elastic/rally-tracks/tree/master/dense_vector">dense_vector</a> com 10 milhões de vetores e 96 dimensões. Ele é baseado no conjunto de dados de imagens <a href="https://big-ann-benchmarks.com/">Yandex DEEP1B</a>. O conjunto de dados é criado a partir dos primeiros 10 milhões de vetores do arquivo "sample data" chamado <code>learn.350M.fbin</code>. As operações de busca usam vetores da consulta do arquivo "query data".<code>public.10K.fbin</code>.</p><p>Tanto o Elasticsearch quanto o OpenSearch têm um desempenho muito bom nesse conjunto de dados, principalmente após uma <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html">fusão forçada</a>, que geralmente é feita em índices somente leitura e é semelhante à desfragmentação do índice para ter uma única "tabela" para buscas.</p><h3>Tarefas</h3><p>Cada tarefa é aquecida para 100 solicitações e, em seguida, 1.000 solicitações são medidas</p><ul><li><p><strong>knn-search-10-100</strong>: buscando em 10 milhões de vetores, k: 10 e n:100</p></li><li><p><strong>knn-search-100-1000</strong>: buscando em 10 milhões de vetores, k: 100 e n:1000</p></li><li><p><strong>knn-search-10-100-force-merge</strong>: buscando em 10 milhões de vetores após uma fusão forçada, k: 10 e n:100</p></li><li><p><strong>knn-search-100-1000-force-merge</strong>: buscando em 10 milhões de vetores após uma fusão forçada, k: 100 e n:1000</p></li><li><p><strong>knn-search-100-1000-concorrente-com-indexação</strong>: buscando em 10 milhões de vetores enquanto também atualiza <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/challenges/default.json#L76C36-L76C37">5% do conjunto de dados</a>, k: 100 e n:1000</p></li><li><p><strong>script-score-query</strong>: busca KNN exata de <a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/queries.json">2000 vetores 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 o Elasticsearch quanto o OpenSearch tiveram bom desempenho para Approximate KNN. Quando o índice é mesclado (tem apenas um único segmento) em <em>knn-search-100-1000-force-merge</em> e <em>knn-search-10-100-force-merge</em>, o OpenSearch tem um desempenho melhor do que os outros ao usar <code>nmslib</code> e <code>faiss</code>, mesmo que todos estejam em torno de 15ms e muito próximos.</p><p>No entanto, quando o índice tem múltiplos segmentos (situação típica em que um índice recebe atualizações nos documentos) em <em>knn-search-10-100</em> e <em>knn-search-100-1000</em>, o Elasticsearch mantém a latência em cerca de ~7 ms e ~16 ms, enquanto todos os outros mecanismos OpenSearch são mais lentos.</p><p>Além disso, quando o índice está sendo buscado e gravado ao mesmo tempo (<em>knn-search-100-1000-concurrent-with-indexing</em>), o Elasticsearch mantém a latência abaixo de 15ms (13,8ms), sendo quase <strong>4 vezes mais rápido</strong> do que o OpenSearch pronto para uso (49,3ms) e ainda mais rápido quando a busca de segmento simultânea está ativada (17,9ms), mas muito próximo para ser significativo.</p><p>Quanto ao Exact KNN, a diferença é muito maior: o Elasticsearch <strong>é 6x mais rápido</strong> que o OpenSearch (~260ms vs ~1600ms).</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 milhões de vetores, 768 dimensões (so_vector)</h2><p>Essa <a href="https://github.com/elastic/rally-tracks/tree/master/so_vector">trilha</a>, <code>so_vector</code>, é derivada de um <a href="https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z">dump de postagens do StackOverflow baixadas</a> em 21 de abril de 2022. Ele contém apenas documentos de perguntas — todos os documentos que representam respostas foram retirados. O título de cada pergunta foi codificado em um vetor usando o modelo de transformador de sentença <a href="https://huggingface.co/sentence-transformers/multi-qa-mpnet-base-cos-v1">multi-qa-mpnet-base-cos-v1</a>. Este conjunto de dados contém as primeiras 2 milhões de perguntas.</p><p>Diferente da trilha anterior, cada documento aqui contém outros campos além de vetores para aceitar recursos de teste como KNN Aproximado com filtragem e busca híbrida. <code>nmslib</code> para OpenSearch está notavelmente ausente neste teste, já que <a href="https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/#k-nn-search-with-filters">ele não aceita filtros</a>.</p><h3>Tarefas</h3><p>Cada tarefa é aquecida com 100 solicitações e, em seguida, 100 solicitações são medidas. Observe que as tarefas foram agrupadas para simplificar, pois o teste contém 16 tipos de busca * 2 valores de k diferentes * 3 valores de n diferentes.</p><ul><li><p><strong>knn-10-50</strong>: buscando em 2 milhões de vetores sem filtros, k:10 e n:50</p></li><li><p><strong>knn-10-50-filtrado</strong>: buscando em 2 milhões de vetores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">com filtros</a>, k:10 e n:50</p></li><li><p><strong>knn-10-50-após-fusão-forçada</strong>: buscando em 2 milhões de vetores com filtros e após uma fusão forçada, k:10 e n:50</p></li><li><p><strong>knn-10-100</strong>: buscando em 2 milhões de vetores sem filtros, k:10 e n:100</p></li><li><p><strong>knn-10-100-filtered</strong>: buscando em 2 milhões de vetores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">com filtros</a>, k:10 e n:100</p></li><li><p><strong>knn-10-100-after-force-merge</strong>: buscando em 2 milhões de vetores com filtros e após uma fusão forçada, k:10 e n:100</p></li><li><p><strong>knn-100-1000</strong>: buscando em 2 milhões de vetores sem filtros, k:100 e n:1000</p></li><li><p><strong>knn-100-1000-filtered</strong>: buscando em 2 milhões de vetores <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">com filtros</a>, k:100 e n:1000</p></li><li><p><strong>knn-100-1000-after-force-merge</strong>: buscando em 2 milhões de vetores com filtros e após uma fusão forçada, k:100 e n:1000</p></li><li><p><strong>exact-knn</strong>: busca KNN exata <a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json#L56">com e sem filtros</a>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b44e1306af35877/6a17d72f577262aca11bca3e/d4ed2982d55370cad4b2048b23ce97caa55017c0-1440x316.webp" alt="tabela so_vector" /><p>O Elasticsearch é <strong>consistentemente mais rápido</strong> que o OpenSearch pronto para uso neste teste, apenas em dois casos o OpenSearch é mais rápido, e não muito (<em>knn-10-100</em> e <em>knn-100-1000</em>). Tarefas envolvendo <em>knn-10-50</em>, <em>knn-10-100</em> e <em>knn-100-1000</em> em combinação com filtros mostram uma diferença de até <strong>7x</strong> (112ms vs 803ms).</p><p>O desempenho de ambas as soluções parece se equilibrar após uma "force merge", o que é compreensível, conforme evidenciado por <em>knn-10-50-after-force-merge</em>, <em>knn-100-after-force-merge</em> e <em>knn-100-1000-after-force-merge</em>. Nessas tarefas, <code>faiss</code> é mais rápido.</p><p>O desempenho do Exact KNN mais uma vez é muito diferente, com o Elasticsearch sendo <strong>13 vezes mais rápido</strong> que o OpenSearch desta vez (~385ms vs ~5262ms).</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 e Lucene como vencedores claros</h2><p>Na Elastic, estamos inovando incessantemente o Apache Lucene e o Elasticsearch para garantir que sejamos capazes de fornecer o principal banco de dados vetorial para casos de uso de busca e recuperação, incluindo RAG (retrieval-augmented generation). Nossos avanços recentes aumentaram drasticamente o desempenho, tornando a busca vetorial <a href="https://search-labs.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">mais rápida e mais eficiente em termos de espaço</a> do que antes, com base nos ganhos do Lucene 9.10. Esse blog apresentou um estudo que mostra que, ao comparar versões atualizadas, o Elasticsearch é até 12 vezes mais rápido que o OpenSearch.</p><p>Vale a pena observar que ambos os produtos usam a mesma versão do Lucene (<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-8.14.0.html">notas de lançamento do Elasticsearch 8.14</a> e <a href="https://github.com/opensearch-project/OpenSearch/blob/2.14/release-notes/opensearch.release-notes-2.14.0.md">notas de lançamento do OpenSearch 2.14</a>).</p><p>O ritmo de inovação na Elastic proporcionará ainda mais não apenas para nossos clientes no local e do Elastic Cloud, mas também para aqueles que usam nossa <a href="https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">plataforma sem estado</a>. Recursos como suporte para <a href="https://www.elastic.co/search-labs/blog/int4-scalar-quantization-in-lucene">quantização escalar para int4</a> serão oferecidos com testes rigorosos para que os clientes possam utilizar essas técnicas sem uma queda significativa no recall, semelhante aos <a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">nossos testes para int8</a>.</p><p>A eficiência da busca vetorial está sendo um recurso inegociável nos mecanismos de busca modernos devido à proliferação de aplicações de IA e machine learning. Nas organizações que procuram um mecanismo de busca poderoso, capaz de acompanhar as demandas de dados vetoriais de alto volume e alta complexidade, o Elasticsearch é a resposta definitiva.</p><p>Seja expandindo uma plataforma estabelecida ou iniciando novos projetos, a integração do Elasticsearch para as necessidades de busca vetorial é um movimento estratégico que produzirá benefícios tangíveis e de longo prazo. Com a vantagem de desempenho comprovada, o Elasticsearch está pronto para sustentar a próxima onda de inovações em busca.</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[Banco de dados vetorial]]></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>