<?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/jp/search-labs/author/ugo-sangiorgi</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/author/ugo-sangiorgi</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/author/ugo-sangiorgi.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 04:43:19 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Elasticsearch BBQ vs. OpenSearch FAISS: ベクトル検索パフォーマンス比較]]></title>
    <description><![CDATA[Elasticsearch BBQ と OpenSearch FAISS のパフォーマンス比較。]]></description>
    <content:encoded><![CDATA[<p><strong>バイナリ量子化によるベクトル検索: BBQ を使用した Elasticsearch は、 FAISS を使用した OpenSearch よりも 5 倍高速です</strong>。Elastic はコミュニティから、特にセマンティック検索/ベクター検索の領域における Elasticsearch と OpenSearch のパフォーマンスの違いを明確にしてほしいというリクエストを受けており、明確でデータに基づいた比較を提供するためにこれらのパフォーマンス テストを実施しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta8792b5284e7a553/6a1709b9961e69a084c4cee6/7f4f8d08f7bee188423e4e65f0caefc7e34f0355-1600x681.png" alt="Elasticsearch BBQ vs. OpenSearch FAISS - 速度とスループットの再現率の比較" /><h2>バイナリ量子化対決</h2><p>高次元ベクトルを元の形式で保存すると、メモリを大量に消費する可能性があります。量子化技術はこれらのベクトルをコンパクトな表現に圧縮し、メモリフットプリントを大幅に削減します。その後、検索は圧縮された空間で実行されるため、計算の複雑さが軽減され、特に大規模なデータセットでは検索が高速化されます。</p><p>Elastic は、Lucene を最高のパフォーマンスを発揮するベクター エンジンにすることに注力しています。Elasticsearch 8.16 では Lucene をベースに<a href="https://www.elastic.co/jp/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization</a> (BBQ) を導入し、8.18 および 9.0 でさらに進化させました。BBQ は、float32 次元をビットに削減する<a href="https://www.elastic.co/jp/search-labs/blog/optimized-scalar-quantization-elasticsearch">スカラー量子化</a>の新しいアプローチに基づいて構築されており、高いランキング品質を維持しながら約 95% のメモリ削減を実現します。</p><p>一方、OpenSearch は、nmslib (現在は非推奨)、Lucene、FAISS といった複数のベクター エンジンを使用します。<a href="https://www.elastic.co/jp/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison">以前のブログ</a>では、ベクトル検索について Elasticsearch と OpenSearch を比較しました。3 つの異なるデータセットを使用し、両方の製品でさまざまなエンジンと構成の組み合わせをテストしました。</p><p>このブログでは、現在両方の製品で利用可能なバイナリ量子化アルゴリズムに焦点を当てています。<a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a> Rally トラックを使用して、Elasticsearch と BBQ および<a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization"> OpenSearch と FAISS のバイナリ量子化を テストしました。</a></p><p>主な目的は、同じレベルの再現率で両方のソリューションのパフォーマンスを評価することでした。<em>リコールと</em>はどういう意味ですか?リコールは、検索システムによって関連結果がどれだけ正常に取得されたかを測定する指標です。</p><p>この評価では、recall@k が特に重要です。ここで、 <em>k は</em>検討される上位の結果の数を表します。したがって、 <strong>Recall@10</strong> 、 <strong>Recall@50、および Recall@100 は、</strong>それぞれ上位 10、50、および 100 件の取得された項目内に表示される実際の関連結果の数を測定します。再現率は 0 ～ 1 (または 0% ～ 100% の精度) のスケールで表されます。これは重要なことです。なぜなら、ここでは再現率が常に 1 (100%) となる正確な KNN ではなく、近似 KNN (ANN) について話しているためです。</p><p><em>k</em>の各値に対して、最終的なランキングを適用する前に考慮される候補の数である<em>n</em>も指定しました。つまり、Recall@10、Recall@50、および Recall@100 の場合、システムは最初にバイナリ量子化アルゴリズムを使用して<em>n</em>個の候補を取得し、次にそれらをランク付けして、上位<em>k 個</em>の結果に期待される関連項目が含まれているかどうかを判断します。</p><p><em>n を</em>制御することで、効率と精度のトレードオフを分析できます。通常、 <em>n</em>が大きいほど、ランキングに使用できる候補が増えるためリコール<strong>は増加します</strong>が、レイテンシも<strong>増加し</strong>、スループット<strong>は低下します</strong>。逆に、 <em>n</em>を小さくすると検索速度は上がりますが、初期セットに含まれる関連候補が少なすぎるとリコール率が低下する可能性があります。</p><p>この比較では、Elasticsearch は同一の設定で OpenSearch よりも低いレイテンシと高いスループットを示しました。</p><h2>方法論</h2><p>完全な構成、Terraform スクリプト、Kubernetes マニフェスト、および特定の Rally トラックは、この<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/tree/bbq">リポジトリ</a>の<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>以前のベンチマークと同様に、次のもので構成される Kubernetes クラスターを使用しました。</p><ul><li><p>Elasticsearch 9.0 用の 1 つのノードプール（3 台の<code>e2-standard-32</code>マシン、128 GB の RAM、32 個の CPU）</p></li><li><p>OpenSearch 2.19 用の 1 つのノード プール (3 台の<code>e2-standard-32</code>マシン (128 GB RAM、32 個の CPU))</p></li><li><p>Rally 用の 1 つのノードプール（2 台の<code>e2-standard-4</code>マシン、16 GB の RAM と 4 つの CPU）</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt934e988e96a5849f/6a1709bbacf08838f9be9ac1/169bb6033f6eebfd1b177b3446bf916fde4ee5c5-1600x856.png" alt="Elasticsearch BBQ vs Opensearch FAISS方法論のセットアップ" /><p>Elasticsearch クラスター バージョン 9.0 を 1 つと OpenSearch クラスター バージョン 2.19 を 1 つセットアップしました。</p><p>Elasticsearch と OpenSearch は両方ともまったく同じ設定でテストされました。 つまり、OpenAI の<a href="https://openai.com/blog/new-and-improved-embedding-model"> text-embedding-ada-002 モデルを使用して生成された埋め込みが強化された</a><a href="https://huggingface.co/datasets/BeIR/nq"> NQ データ セットからの</a> 250 万のドキュメントを使用する、いくつかの変更 を<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/commit/b97d5d95c22c8cf862f2030964524bdd156a5da3"> 加え た</a><a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector"> openai_vector</a> Rally トラック を使用しました。</p>{
  "source-file": "open_ai_corpus-initial-indexing.json.bz2",
  "document-count": 2580961,
  "compressed-bytes": 32076749416,
  "uncompressed-bytes": 90263571686
}<p>結果には、8 つの同時クライアントを使用して検索操作を実行し、さまざまなリコール レベル (recall@10、recall@50、recall@100) で測定されたレイテンシとスループットが報告されています。単一のシャードを使用し、レプリカは使用しませんでした。</p><p>我々は以下のkn-rescoreの組み合わせを実行した。10-2000-2000、または<em>k:10</em> 、 <em>n:2000</em> 、 <em>rescore:2000 は</em>、2000 件の結果に対して再スコアを適用して、n 件の候補 (2000) のうち上位 k 件 (10) を取得します (これは「オーバーサンプル係数」が 1 の場合に相当します)。各検索はウォームアップとして 1,000 回実行され、10,000 回実行されました。</p><p></p><p><u><strong>リコール@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>2000年10月</p></li></ul><p><u><strong>リコール@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>リコール@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>ベンチマークを再現するために、rally-elasticsearch と rally-opensearch の両方の Kubernetes マニフェストには、関連するすべての変数が ConfigMap で外部化されており、<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-es-bq.yml">こちら</a>(ES) と<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/bbq/k8s/rally-openai_vector-os-bq.yml">こちら</a>(OS) から入手できます。<em>search_ops</em>パラメータは、k、n、rescore の任意の組み合わせをテストするようにカスタマイズできます。</p><h3>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>Opensearchインデックス設定</h3><p>ConfigMap の変数はインデックス構成で使用され、一部のパラメータは変更されません。OpenSearch における 1 ビット量子化は<a href="https://opensearch.org/docs/latest/search-plugins/knn/knn-vector-quantization/#binary-quantization">、圧縮レベルを「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>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>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>成果</h2><p>結果を解釈する方法は複数あります。レイテンシとスループットの両方について、リコールの各レベルで簡略化されたグラフと詳細なグラフをプロットしました。各指標について「高いほど良い」と考えると、違いが簡単にわかります。ただし、レイテンシはマイナス（低い方が実際には良い）であり、スループットはプラスです。簡略化されたグラフでは、 <strong>(リコール / レイテンシ) * 10000</strong> (単に「速度」と呼びます) と<strong>リコール * スループット</strong>を使用しました。したがって、両方のメトリックは、速度とスループットが高いほど優れていることを意味します。始めましょう。</p><h3>10回想 - 簡略化</h3><p>この再現レベルでは、Elasticsearch BBQ は OpenSearch FAISS よりも最大<strong>5 倍高速</strong>(平均で 3.9 倍高速) で、平均で<strong>3.2 倍のスループット</strong>を実現します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3de6b3460127a8ae/6a1709bcb339d55975769f6f/d580ad53e8974bd3aa75957c413a0136c4e465c5-1600x681.png" alt="Elasticsearch BBQは、OpenSearch FAISSの速度とスループットと比較して、最大5倍（平均3.9倍）高速で、平均3.2倍のスループットを実現しています。Recall@10" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd47045013cac5e9d/6a1709be0e2e49599a41a088/18edce667fe36ab95033264ef8df6f352dda2425-2044x866.png" alt="Elasticsearch BBQ は OpenSearch FAISS よりも最大 5 倍高速 (平均 3.9 倍高速) で、平均 3.2 倍のスループットを実現します。" /><h4>リコール@10 - 詳細</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ecb02d4a2967dbd/6a1709bf14b270c04fe3c5c6/a7459b87e679f4ad963d0e2f1685499b40f6f050-1600x799.png" alt="詳細な再現率@10レイテンシ比較 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt182da309ad6cfd39/6a1709c166c4f99077f8bfd8/c6036f55a13377654d296eb3148c7199e1965475-1600x799.png" alt="Elasticsearch BBQ と Opensearch FAISS の詳細なリコール@10 スループット比較。" /><p></p><p>タスク</p><p>レイテンシ平均</p><p>スループット平均</p><p>平均再現率</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>2000年10月</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>2000年10月</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>50歳の思い出 - 簡略化</h3><p>この再現率では、Elasticsearch BBQは<strong>最大5倍（平均4.2倍）高速で</strong>、平均<strong>3.9倍のスループット</strong>を実現しています。OpenSearch FAISSよりも。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt486683f2c7a1d677/6a1709c2a6c2b995bde796a3/3189ffb330948b35854eeea9ae317d4846c14972-1600x681.png" alt="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 は OpenSearch FAISS よりも最大 5 倍高速 (平均 4.2 倍高速) で、平均 3.9 倍のスループットを実現します。" /><h4>詳細な結果 - 50 回のリコール</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt821775e7f87e5ede/6a1709c6a6c2b90af3e796a7/ebfffe0b776aad31dd03d315cfbf5aa098b41226-1600x789.png" alt="Recall@50 Elasticsearch BBQ と Opensearch FAISS のレイテンシ結果を振り返る" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4f47784ed1017c15/6a1709c7e8fbce0fbe39fbf5/ae20cf870a65c400a2112bbad62eb56e244f549a-1600x799.png" alt="Recall@50 Elasticsearch BBQとOpensearch FAISSスループット結果" /><p></p><p>タスク</p><p>レイテンシ平均</p><p>スループット平均</p><p>平均再現率</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>リコール@100</h3><p>この再現レベルでは、Elasticsearch BBQ は OpenSearch FAISS よりも<strong>最大 5 倍高速</strong>(平均 4.6 倍高速) で、平均で<strong>3.9 倍のスループット</strong>を実現します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt380eb9165343a7b3/6a1709c9acf0882669be9ac5/d3f29db64cbde9956de1fa3ae64a75f15141a2bb-1600x681.png" alt="Elasticsearch BBQ VS Opensearch FAISS の結果を 100 回思い出す" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt505ce8aa70898390/6a1709cb1949f73a37e7a9bb/10aff7f8c61fdac895b9ba9c5342baf239ba3ffc-2072x864.png" alt="Elasticsearch BBQとOpensearch FAISSのレイテンシとスループットパフォーマンスの比較" /><h4>詳細な結果 - 再現率 100</h4><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb2a73e29940e9d6b/6a1709cccf4f257615b2d138/8790fdf9512b850447f6875fb69969f6f1d4da5f-1600x799.png" alt="詳細なレイテンシ結果 - リコール率 100 Elasticsearch BBQ vs Opensearch FAISS" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2c91ca21da03d96/6a1709ce0c4857d3fc01aa39/d47032fac6c288cd4eedd9f25001e417b2fa9d65-1600x787.png" alt="詳細なスループット結果 - Elasticsearch BBQ と Opensearch FAISS を 100 で再現。" /><p></p><p>タスク</p><p>レイテンシ平均</p><p>スループット平均</p><p>平均再現率</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>バーベキューの改良</h2><p>BBQ は最初のリリース以来長い道のりを歩んできました。Elasticsearch 8.16 では、比較のために、8.16 のベンチマーク実行を現在のものと並べて含めており、それ以降、リコールとレイテンシーがどのように改善されたかを確認できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f1f7ae1bb425a3a/6a1709cf67045bde8e45c192/45a0acfe5985bff28ccada76ec4eca190fe65f72-1600x799.png" alt="Elasticsearch 9.0 BBQのレイテンシリコールの改善をElasticsearch 8.16 BBQとベンチマーク" /><p>Elasticsearch 8.18 および 9.0 では、ベクトルを量子化するためのコア アルゴリズムを書き直しました。つまり、8.16 の BBQ は良かったのですが、最新バージョンはさらに良くなっています。それについては<a href="https://www.elastic.co/jp/search-labs/blog/optimized-scalar-quantization-elasticsearch">ここ</a>と<a href="https://www.elastic.co/jp/search-labs/blog/scalar-quantization-optimization">ここで</a>読むことができます。つまり、すべてのベクトルは、最適化されたスカラー分位数を通じて個別に量子化されます。その結果、ユーザーはパフォーマンスを犠牲にすることなくベクトル検索の精度向上の恩恵を受けることができ、Elasticsearch のベクトル検索はさらに強力になります。</p><h2>まとめ</h2><p>Elasticsearch BBQ と OpenSearch FAISS のパフォーマンス比較では、Elasticsearch はベクトル検索において OpenSearch を大幅に上回り、さまざまなレベルのリコールで平均最大 5 倍のクエリ速度と 3.9 倍のスループットを達成しています。</p><p>主な調査結果は次のとおりです。</p><ul><li><p><strong>Recall@10</strong> : Elasticsearch BBQ は、OpenSearch FAISS と比較して最大 5 倍高速 (平均 3.9 倍高速) で、平均 3.2 倍のスループットを実現します。</p></li><li><p><strong>Recall@50</strong> : Elasticsearch BBQ は、OpenSearch FAISS と比較して最大 5 倍高速 (平均で 4.2 倍高速) で、平均で 3.9 倍のスループットを実現します。</p></li><li><p><strong>Recall@100</strong> : Elasticsearch BBQ は、OpenSearch FAISS と比較して最大 5 倍高速 (平均で 4.6 倍高速) で、平均で 3.9 倍のスループットを実現します。</p></li></ul><p>これらの結果は、特に高次元ベクトル検索シナリオにおける Elasticsearch BBQ の効率性とパフォーマンスの利点を強調しています。Elasticsearch 8.16 で導入された Better Binary Quantization (BBQ) 技術は、高いランキング品質を維持しながらメモリを大幅に削減 (約 95%) するため、大規模なベクトル検索アプリケーションに最適です。</p><p>Elastic では、RAG (Retrieval Augmented Generation) を含む検索および取得ユースケースに最適なベクター データベースを提供するために、Apache Lucene と Elasticsearch を改良するための革新を絶えず続けています。<a href="https://www.elastic.co/jp/search-labs/blog/optimized-scalar-quantization-elasticsearch">最近の進歩</a>によりパフォーマンスが劇的に向上し、Lucene 10 から得た成果を基にして、ベクター検索が以前よりも高速かつスペース効率が高くなりました。このブログは、その革新のもう一つの例です。</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[Vector Database]]></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[OpenSearchとElasticsearchの違い：ベクトル検索のパフォーマンス比較]]></title>
    <description><![CDATA[Elasticsearchは、ベクトル検索においてOpenSearchよりもデフォルトのままで2倍から12倍高速です]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-opensearch-vector-search-performance-comparison#up-to-12x-faster-out-of-the-box">まとめ：Elasticsearchは最大12倍高速</a> - Elasticでは、特にセマンティック検索/ベクトル検索のレルムにおけるElasticsearchとOpenSearch のパフォーマンスの違いを明確にしてほしいというリクエストをコミュニティから多数受けていました。そこで、このパフォーマンステストを実施して、明確でデータに基づく比較を提供しました。曖昧さはなく、ユーザーに伝えるための単純な事実です。結論としては、<strong>Elasticsearchはベクトル検索においてOpenSearchより最大12倍高速</strong>であるため、必要な計算リソースが少なくなります。これは、ElasticがLuceneを検索および取得ユースケースに最適なベクトルデータベースとして統合することに重点を置いていることを反映しています。</p><p>ベクトル検索は、特にAIや機械学習のフィールドで、類似性検索の方法に革命をもたらしています。ベクトル埋め込みモデルの採用が増えるにつれ、何百万もの高次元ベクトルを効率的に検索する機能が重要になっています。</p><p>ベクトルデータベースの実現方法に関して、ElasticとOpenSearchは著しく異なるアプローチを採用しています。Elasticは、Apache LuceneとElasticsearchがベクトル検索アプリケーションにおけるトップクラスの選択肢となるべく、これらの最適化に多額の投資を行ってきました。対照的に、OpenSearchは焦点を広げ、他のベクトル検索実装を統合し、Luceneの対象範囲を超えて模索を行っています。Elasticは戦略的にLuceneへと焦点を合わせており、弊社版Elasticsearchにおいて高度に統合されたサポートを提供できるため、各コンポーネントが他のコンポーネントの機能を補完および増幅できるという特徴が強化されています。</p><p>このブログでは、Elasticsearch 8.14とOpenSearch 2.14の詳細な比較を、異なる構成とベクトルエンジンを考慮して紹介します。このパフォーマンス分析では、Elasticsearch がベクトル検索操作に優れたプラットフォームであることが証明されました。今後追加予定の<a href="https://www.elastic.co/search-labs/blog/vector-similarity-computations-ludicrous-speed">機能により</a>その差は<a href="https://www.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">さらに</a>拡大するでしょう。OpenSearchと比較すると、すべてのベンチマークトラックで優れた結果を示し、<strong>平均で2倍から12倍高速なパフォーマンスを実現しました</strong>。これは、<code>so_vector</code>（2Mベクトル、768D）、<code>openai_vector</code>（2.5Mベクトル、1536D）、および<code>dense_vector</code>（10Mベクトル、96D）を含む、さまざまなベクトル量と次元を使用したシナリオ全体で行われました。これらはすべて、Google Cloudで必要なインフラストラクチャーをプロビジョニングするためのTerraformスクリプトと、テストを実行するためのKubernetesマニフェストと共に、<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance">このリポジトリ</a>で利用可能です。</p><p>このブログで詳述されている結果は、<a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap">以前に公開され、サードパーティによって検証された調査</a>の結果を補完するものであり、最も一般的な検索分析操作（テキストクエリ、並べ替え、範囲、日付ヒストグラム、用語フィルタリング）では、ElasticsearchがOpenSearchよりも40%–140%高速であることが示されています。これに、別の差別化要因であるベクトル検索を追加します。</p><h2>デフォルトの設定で最大12倍高速</h2><p>4つのベクトルデータセットにわたる重点的なベンチマークには、さまざまなサイズ、次元、構成を考慮した近似KNN検索と正確なKNN検索の両方が含まれ、合計<code>40.189.820</code>のキャッシュされていない検索要求がありました。結果：<strong>Elasticsearchはベクトル検索においてOpenSearchより最大12倍高速である</strong>ため、必要な計算リソースが少なくなります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt34b83c6eba3bcb6e/6a17d727dbb4ff18d6fb54fb/cdb26e91f085b90e9b12aeb8fee53b04d365ecae-1440x1156.webp" alt="p90平均" /><p>図1：ElasticsearchおよびOpenSearchにおけるさまざまなタスクについて、ANNと厳密なKNNをグループ化した図。</p><p><code>knn-10-100</code>のようなグループは、およびのKNN検索を意味します。HNSWベクトル検索では、はクエリベクトルから取得する最近傍の数を決定します。結果として検索する類似ベクトルの数を指定します。は各セグメントで取得する候補ベクトルの数を設定します。候補の数を増やすと精度は向上しますが、より多くの計算リソースが必要になります。</p><p>また、さまざまな量子化手法とエンジン固有の最適化を活用してテストしました。各トラック、タスク、ベクトルエンジンの詳細な結果を以下に示します。</p><h2>厳密なKNNと近似KNN</h2><p>さまざまなデータセットとユースケースを扱う場合、ベクトル検索に適したアプローチは異なります。このブログでは、<code>knn-10-100</code>のように<code>knn-*</code>と記載されているすべてのタスクは<strong>近似KNN</strong>を使用し、<code>script-score-*</code>は<strong>正確なKNN</strong>を参照していますが、それらの違いは何で、なぜ重要なのでしょうか。</p><p>基本的に、より大規模なデータセットを扱う場合、優れた拡張性のある近似K-最近傍法（ANN）が推奨されます。フィルタリング処理が必要な場合のある、より小規模なデータセットの場合、厳密なKNN法が最適です。</p><p>正確なKNNでは、ブルートフォース法を使用して、データセット内の1つのベクトルと他のすべてのベクトルとの間の距離を計算します。次に、これらの距離を順位付けして、の最も近い近傍を見つけます。この方法では正確な一致が保証されますが、大規模で高次元のデータセットでは拡張性の課題があります。ただし、正確なKNNが必要なケースは数多くあります。</p><ul><li><p><strong>再スコアリング</strong>：語彙検索または意味検索の後にベクトルベースの再スコアリングを行うシナリオでは、正確なKNNが不可欠です。例えば、製品検索エンジンでは、テキストクエリ（キーワードやカテゴリなど）に基づいて最初の検索結果をフィルタリングし、フィルタリングされたアイテムに関連付けられたベクトルを使用して、より正確な類似性評価を行うことができます。</p></li><li><p><strong>パーソナライゼーション</strong>：多数のユーザーを扱う際、それぞれが比較的少数（100万個など）の個別のベクトルで表される場合、ユーザー固有のメタデータ（例：user_id）でインデックスをソートし、ベクトルを使用したブルートフォーススコアリングが効率的になります。このアプローチにより、個々のユーザーの好みに合わせた正確なベクトル比較に基づいて、パーソナライズされたレコメンデーションやコンテンツ配信が可能になります。</p></li></ul><p>したがって、厳密なKNNでは、ベクトルの類似性に基づく最終的な順位付けと推奨が正確なものとなり、ユーザーの好みに合わせて調整されるようになります。</p><p>一方、近似KNN（またはANN）は、特に大規模で高次元のデータセットにおいて、厳密なKNNよりも高速かつ効率的にデータ検索を行う方法を採用しています。ANNは、クエリとすべての点の間の正確な最も近い距離を測定することにより計算やスケーリングの問題につながるブルートフォース的なアプローチではなく、特定の手法を使用してデータセットにおける検索可能なベクトルのインデックスと次元を効率的に再構築します。これにより若干の不正確さが生じる可能性がありますが、検索処理速度が大幅に向上するため、大規模なデータセットを処理するための効果的な代替手段となります。</p><p>このブログでは、<code>knn-*</code>として記載されているすべてのタスクは<code>knn-10-100</code>のように<strong>近似KNN</strong>を使用し、<code>script-score-*</code>は<strong>正確なKNN</strong>を参照します。</p><h2>テスト手法</h2><p>ElasticsearchとOpenSearchはBM25検索操作のAPIにおいては似ていますが、後者が前者のフォークであるため、フォーク後に導入されたベクトル検索には当てはまりません。OpenSearchはアルゴリズムに関してElasticsearchとは異なるアプローチを取り、<code>lucene</code>とは別に<code>nmslib</code>と<code>faiss</code>の2つのエンジンを導入しました。それぞれに特定の構成と制限があります（例：OpenSearchの<code>nmslib</code>では、多くのユースケースで不可欠な機能であるフィルターが許可されていません）。</p><p>3つのエンジンはいずれも、階層型ナビゲート可能スモールワールド（HNSW）アルゴリズムを使用しています。このアルゴリズムは近似最近傍を検索するのに効率的で、特に高次元データを扱う際に強力です。<code>faiss</code>は第2のアルゴリズム<code>ivf</code>もサポートしていますが、データセットの事前トレーニングが必要なため、ここではHNSWのみに焦点を当てます。HNSWの中心的な考え方は、データを複数の接続されたグラフのレイヤーに整理し、各レイヤーがデータセットの異なる粒度を表すことです。検索は最も粗いビューの最上位レイヤーから始まり、ベースレベルに到達するまで、より細かいレイヤーへと進みます。</p><p>公平なテストの場を確保するために、両方の検索エンジンは制御された環境内で同一の条件下でテストされました。適用された方法は、Elasticsearch、OpenSearch、Rally専用のノードプールを使用した<a href="https://www.elastic.co/blog/elasticsearch-opensearch-performance-gap#testing-methodology">以前に公開されたパフォーマンス比較</a>と似ています。<a href="https://github.com/elastic/elasticsearch-opensearch-vector-performance/blob/main/terraform/main.tf">terraformスクリプト</a>は（すべてのソースとともに）Kubernetesクラスターを提供するために利用可能です。</p><ul><li><p>Elasticsearch用の3台の<code>e2-standard-32</code>マシン（128GB RAM、32CPU）を持つ1つのNodeプール</p></li><li><p>OpenSearch用の3台の<code>e2-standard-32</code>マシン（128GB RAM、32CPU）を持つ1つのNodeプール</p></li><li><p>Rally用の2台の<code>t2a-standard-16</code>マシン（64GB RAM、16CPU）を持つ1つのNodeプール</p></li></ul><p>各「トラック」（またはテスト）を、異なるエンジン、異なる設定、異なるベクトルタイプを含む各設定に対して10回実行しました。各トラックには、トラックにより1000回から10000回まで繰り返すタスクがあります。ネットワークのタイムアウトなどでトラック内のタスクの1つが失敗した場合はすべてのタスクを無視したため、すべての結果は問題なく開始して終了したトラックを表します。すべてのテスト結果は統計的に検証されており、改善が偶然ではないことが保証されています。</p><h2>詳細な調査結果</h2><p>平均レイテンシではなく99パーセンタイルを使用して比較するのはなぜでしょうか。特定の地域の平均住宅価格の例を想像してみましょう。平均価格によれば高価な地域となっていても、よく調べてみると、ほとんどの住宅の価値ははるかに低く、わずかな高級物件が平均値を膨らませていることがわかるかもしれません。これは、平均価格がその地域の住宅価値の全範囲を正確に表現できない可能性があることを示しています。同じようなことが、応答時間についても言えます。平均値が重要な問題を隠してしまうことがあるのです。</p><h4>タスク</h4><ul><li><p>近似KNN（k:10 n:50）</p></li><li><p>近似KNN（k:10 n:100）</p></li><li><p>近似KNN（k:100 n:1000）</p></li><li><p>近似KNN（k:10 n:50、キーワードフィルター併用）</p></li><li><p>近似KNN（k:10 n:100、キーワードフィルター併用）</p></li><li><p>近似KNN（k:100 n:1000、キーワードフィルター併用）</p></li><li><p>近似KNN（k:10 n:100、インデックス作成と同時実行）</p></li><li><p>厳密なKNN（スクリプトスコア）</p></li></ul><h4>ベクトルエンジン</h4><ul><li><p><code>lucene</code> （ElasticsearchとOpenSearchにおいて、両方ともバージョン9.10）</p></li><li><p><code>faiss</code> （OpenSearchにおいて）</p></li><li><p><code>nmslib</code> （OpenSearchにおいて）</p></li></ul><h4>ベクトルの種類</h4><ul><li><p><code>hnsw</code> （ElasticsearchとOpenSearchにおいて）</p></li><li><p><code>int8_hnsw</code> Elasticsearch内（自動8ビット量子化を備えたHNSW：<a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">リンク</a>）</p></li><li><p><code>sq_fp16 hnsw </code>OpenSearch内（自動16ビット量子化を備えたHNSW：<a href="https://opensearch.org/docs/2.14/search-plugins/knn/knn-vector-quantization#faiss-16-bit-scalar-quantization">リンク</a>）</p></li></ul><h4>すぐに使える同時セグメント検索</h4><p>ご存知かと思いますが、LuceneはJavaで記述された高性能なテキスト検索エンジンライブラリであり、Elasticsearch、OpenSearch、Solrなどの多くの検索プラットフォームのバックボーンとして機能します。Luceneは本質的に、データをセグメントに整理します。セグメントは本質的には自己完結型のインデックスであり、Luceneがより効率的に検索を実行できるようにします。そのため、Luceneベースの検索エンジンに検索を発行すると、検索はそれらのセグメントで順次または並行して実行されます。</p><p>OpenSearchは同時セグメント検索をオプションのフラグとして導入しましたが、デフォルトでは使用されません。特別なインデックス設定<code>index.search.concurrent_segment_search.enabled</code>を使用して有効にする必要があります。詳細は<a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/">こちら</a>をご覧ください。ただし、いくつかの<a href="https://opensearch.org/docs/latest/search-plugins/concurrent-segment-search/#other-considerations">制限</a>があります。</p><p>一方、Elasticsearchは<a href="https://github.com/elastic/elasticsearch/pull/101230">すぐに使用できる状態</a>でセグメントを同時に検索するため、このブログでの比較では、さまざまなベクトルエンジンとベクトルタイプに加えて、さまざまな構成も考慮に入れます。</p><ul><li><p>Elasticsearch ootb：同時セグメント検索検索を備えたデフォルト設定のElasticsearch</p></li><li><p>OpenSearch ootb：同時セグメント検索が有効でない状態</p></li><li><p>OpenSearch css：同時セグメント検索が有効な状態</p></li></ul><p>それでは、テストした各ベクトルデータセットの詳細な結果を見てみましょう。</p><h2>250万ベクトル、1536次元（openai_vector）</h2><p>最も単純なトラックで、かつ次元の点でも最大の<a href="https://github.com/elastic/rally-tracks/edit/master/openai_vector">openai_vector</a>から始めます。これは、OpenAIの<a href="https://openai.com/blog/new-and-improved-embedding-model">text-embedding-ada-002モデル</a>を使用して生成された埋め込みで強化された<a href="https://huggingface.co/datasets/BeIR/nq">NQデータセット</a>を使用します。これは、近似KNNのみをテストし、タスクが5つしかないため、最も単純です。スタンドアロン（インデキシングなし）でのテストと、インデキシングと並行してのテストが可能で、単一クライアントと8つの同時クライアントを使用します。</p><h3>タスク</h3><ul><li><p><strong>standalone-search-knn-10-100-multiple-clients</strong>：8クライアントで250万ベクトルを同時に検索、k: 10およびn:100</p></li><li><p><strong>standalone-search-knn-100-1000-multiple-clients</strong>：8クライアントで250万ベクトルを同時に検索、k: 100およびn:1000</p></li><li><p><strong>standalone-search-knn-10-100-single-client</strong>：単一クライアントで250万ベクトルを検索、k: 10およびn:100</p></li><li><p><strong>standalone-search-knn-100-1000-single-client</strong>：単一クライアントで250万ベクトルを検索、k: 100およびn:1000</p></li><li><p><strong>parallel-documents-indexing-search-knn-10-100</strong>：250万ベクトルを検索しながら追加の10万ドキュメントをインデキシング、k:10およびn:100</p></li></ul><p>p99の平均パフォーマンスの概要は次のとおりです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5791848eb0c12fb/6a17d72925daab9cae08a09e/eea0b2b49c690baada3e09d6968e513bfffe51a9-1440x318.webp" alt="openai_vectorテーブル" /><p>ここで、 :10、:100でベクトル検索とインデックス作成（つまり読み取り+書き込み）を実行した場合、ElasticsearchはOpenSearchよりも<strong>3～8倍高速</strong>であり、kとnが同一のインデックス作成なしの場合には<strong>2～3倍高速</strong>であることがわかりました。:100 および:1000（<em>standalone-search-knn-100-1000-single-client</em>および<em>standalone-search-knn-100-1000-multiple-clients</em>）の場合、Elasticsearchは平均して OpenSearch より<strong>2倍から7倍</strong>高速です。</p><p>詳細な結果には、比較された具体的なケースとベクトルエンジンが示されています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbe41d3187ced7ec/6a17d72a445de951c44cff4c/a7a761ed631d3e6211beb83d9d93d752d10123c9-1440x1728.webp" alt="openai_vector" /><h4>リコール</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>1,000万ベクトル、96次元（dense_vector）</h2><p><a href="https://github.com/elastic/rally-tracks/tree/master/dense_vector">dense_vector</a>には、1,000万ベクトルと96次元があります。これは<a href="https://big-ann-benchmarks.com/">Yandex DEEP1B</a>画像データセットに基づいています。データセットは、「sample data」ファイル<code>learn.350M.fbin</code>の最初の1,000万ベクトルから作成されます。検索操作では、「query data」ファイルクエリのベクトルを使用します。<code>public.10K.fbin</code>。</p><p>ElasticsearchとOpenSearchの両方がこのデータセットで非常に優れたパフォーマンスを発揮します。特に、通常読み取り専用のインデックスで実行される<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html">force merge</a>の後では顕著です。これは、インデックスをデフラグして検索用の単一の「テーブル」を作成するのと似ています。</p><h3>タスク</h3><p>各タスクは100リクエストでウォームアップされ、その後1000リクエストが測定されます。</p><ul><li><p><strong>knn-search-10-100</strong>: 1000万ベクトルを検索、k: 10およびn:100</p></li><li><p><strong>knn-search-100-1000</strong>：1000万ベクトルを検索、k: 100およびn:1000</p></li><li><p><strong>knn-search-10-100-force-merge</strong>：強制マージ後の1000万ベクトルの検索、k: 10およびn:100</p></li><li><p><strong>knn-search-100-1000-force-merge</strong>：強制マージ後の1000万ベクトルの検索、k: 100およびn:1000</p></li><li><p><strong>knn-search-100-1000-concurrent-with-indexing</strong>：1000万ベクトルを検索しながら<a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/challenges/default.json#L76C36-L76C37">データセットの5%を</a>更新、k: 100およびn:1000</p></li><li><p><strong>script-score-query</strong>：<a href="https://github.com/elastic/rally-tracks/blob/master/dense_vector/queries.json">特定の2000ベクトル</a>の正確なKNN検索。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4629d06af85eb96c/6a17d72c6864a423e7b685dc/174995e0a2156d86359cdb7aa446dfaae6312ea4-1440x316.webp" alt="dense_vector" /><p>ElasticsearchとOpenSearchはどちらも近似KNNに対して良好なパフォーマンスを示しました。<em>knn-search-100-1000-force-merge</em>および<em>knn-search-10-100-force-merge</em>でインデックスが結合されている場合（つまり、セグメントが1つだけの場合）、<code>nmslib</code>および<code>faiss</code>を使用すると、いずれも約15ミリ秒で非常に近い値であるにもかかわらず、OpenSearchのパフォーマンスは他よりも優れています。</p><p>ただし、インデックスに複数のセグメントがある場合（インデックスがドキュメントの更新を受け取る典型的な状況）において、<em>knn-search-10-100</em>と<em>knn-search-100-1000</em>では、Elasticsearchは遅延を約7ミリ秒と16ミリ秒に保ちますが、他のすべてのOpenSearchエンジンはより遅くなります。</p><p>また、インデックスが検索され、同時に書き込まれる場合（<em>knn-search-100-1000-concurrent-with-indexing</em>）、Elasticsearchはレイテンシを15ミリ秒以下に保守し（13.8ミリ秒）、OpenSearchの出荷時（49.3ミリ秒）よりも<strong>4倍近く高速</strong>であり、同時セグメント検索が有効な場合でも（17.9ミリ秒）、依然として高速ですが、有意差があるほどではありません。</p><p>正確なKNNに関しては、その差はさらに大きくなります。Elasticsearch は OpenSearch よりも<strong>6 倍高速です</strong>（約 260 ミリ秒対約 1600 ミリ秒）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt254f43bcaa3dbfc2/6a17d72ddbb4ffc780fb54ff/17aec6be31117440bc4d1f99984aed95df1c4f6b-1440x1728.webp" alt="dense_vector" /><h4>リコール</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>200万ベクトル、768次元（so_vector）</h2><p>この<a href="https://github.com/elastic/rally-tracks/tree/master/so_vector">トラック</a>、<code>so_vector</code>、は2022年4月21日にダウンロードされた<a href="https://archive.org/download/stackexchange/stackoverflow.com-Posts.7z">StackOverflowの投稿のダンプ</a>から派生しています。質問文書のみが含まれており、回答を表す文書はすべて削除されています。各質問タイトルは、文変換モデル<a href="https://huggingface.co/sentence-transformers/multi-qa-mpnet-base-cos-v1">multi-qa-mpnet-base-cos-v1</a>を使用してベクトルにエンコードされました。このデータセットには最初の200万件の質問が含まれています。</p><p>前のトラックとは異なり、ここでの各ドキュメントには、フィルタリングとハイブリッド検索を備えた近似KNNなどのテスト機能をサポートするためのベクトル以外のフィールドも含まれています。OpenSearchの<code>nmslib</code>は<a href="https://opensearch.org/docs/latest/search-plugins/knn/filter-search-knn/#k-nn-search-with-filters">フィルターをサポートしていない</a>ため、このテストには含まれていません。</p><h3>タスク</h3><p>各タスクは100件のリクエストに対してウォームアップされ、その後100件のリクエストが測定されます。テストには16種類の検索タイプ*2つの異なるk値*3つの異なるn値が含まれているため、簡潔にするためにタスクがグループ化されていることに注意してください。</p><ul><li><p><strong>knn-10-50</strong>：フィルターなしで200万ベクトルを検索、k:10およびn:50</p></li><li><p><strong>knn-10-50-filtered</strong>：200万ベクトルを<a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">フィルターを使用して</a>検索、k:10およびn:50</p></li><li><p><strong>knn-10-50-after-force-merge</strong>：200万ベクトルを強制マージ後にフィルターを使用して検索、k:10およびn:50</p></li><li><p><strong>knn-10-100</strong>：フィルターなしで200万ベクトルを検索、k:10およびn:100</p></li><li><p><strong>knn-10-100-filtered</strong>：200万ベクトルを<a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">フィルターを使用して</a>検索、k:10およびn:100</p></li><li><p><strong>knn-10-100-after-force-merge</strong>：200万ベクトルを強制マージ後にフィルターを使用して検索、k:10およびn:100</p></li><li><p><strong>knn-100-1000</strong>：フィルターなしで200万ベクトルを検索、k:100およびn:1000</p></li><li><p><strong>knn-100-1000-filtered</strong>：200万ベクトルを<a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json">フィルターを使用して</a>検索、k:100およびn:1000</p></li><li><p><strong>knn-100-1000-after-force-merge</strong>：200万ベクトルを強制マージ後にフィルターを使用して検索、k:100およびn:1000</p></li><li><p><strong>exact-knn</strong>：<a href="https://github.com/elastic/rally-tracks/blob/master/so_vector/operations/default.json#L56">フィルターあり、フィルターなしの</a>正確なKNN検索。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8b44e1306af35877/6a17d72f577262aca11bca3e/d4ed2982d55370cad4b2048b23ce97caa55017c0-1440x316.webp" alt="so_vectorテーブル" /><p>このテストでは、ElasticsearchはOpenSearchよりも<strong>一貫して高速で</strong>あり、OpenSearchの方が高速なのは2つのケースのみで、その差はそれほど大きくありません（<em>knn-10-100</em>と<em>knn-100-1000</em>）。<em>knn-10-50</em>、<em>knn-10-100</em>、<em>knn-100-1000</em>をフィルターと組み合わせて使用するタスクでは、最大<strong>7倍</strong>（112ミリ秒対803ミリ秒）の差が見られます。</p><p>当然ながら、<em>knn-10-50-after-force-merge</em>、<em>knn-10-100-after-force-merge</em>、knn-100-1000-after-force-mergeで証明されているように、両方のソリューションのパフォーマンスは「<em>強制マージ」後に均等になるようです。</em>これらのタスクでは、 <code>faiss</code>の方が高速です。</p><p>Exact KNNのパフォーマンスは今回も大きく異なり、ElasticsearchはOpenSearchより<strong>13倍高速</strong>です（約385ミリ秒対約5262ミリ秒）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf80ccc7c2df84559/6a17d7314b055de00d43203f/615cb9228eb05ddd2e9512b3a6a5bc88d4088a1a-1440x1440.webp" alt="so_vector" /><h4>リコール</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とLuceneが明確な勝者に</h2><p>Elasticでは、Apache LuceneとElasticsearchを絶え間なく革新し、RAG（Retrieval-Augmented Generation）を含む検索および取得のユースケースに最適なベクトルデータベースを提供できるようにしています。最近の進歩により、パフォーマンスが大幅に改善され、ベクトル検索が<a href="https://search-labs.elastic.co/search-labs/blog/elasticsearch-lucene-vector-database-gains">以前よりも高速かつスペース効率的</a>になりました。これはLucene 9.10からの成果を基に構築されています。このブログでは、最新バージョンを比較すると、ElasticsearchがOpenSearchよりも最大12倍高速であることを示す調査を紹介しました。</p><p>両方の製品が同じバージョンのLucene（<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-8.14.0.html">Elasticsearch 8.14リリースノート</a>および<a href="https://github.com/opensearch-project/OpenSearch/blob/2.14/release-notes/opensearch.release-notes-2.14.0.md">OpenSearch2.14 リリースノート</a>）を使用していることは注目に値します。</p><p>Elasticのイノベーションのペースは、オンプレミスおよびElastic Cloudのお客様だけでなく、<a href="https://www.elastic.co/search-labs/blog/stateless-your-new-state-of-find-with-elasticsearch">ステートレスプラットフォーム</a>を使用しているお客様にもさらに多くの成果をもたらします。<a href="https://www.elastic.co/search-labs/blog/int4-scalar-quantization-in-lucene">int4へのスカラー量子化</a>のサポートなどの機能は、<a href="https://www.elastic.co/search-labs/blog/evaluating-scalar-quantization">int8のテスト</a>と同様に、顧客が再現率を大幅に低下させることなくこれらの手法を利用できるように、厳格なテストを経て提供されます。</p><p>AIおよび機械学習アプリケーションの急増により、ベクトル検索の効率は現代の検索エンジンでは交渉の余地のない機能になりつつあります。大量で複雑なベクトルデータの要求に対応できる強力な検索エンジンを探している組織にとって、Elasticsearchは決定的な答えです。</p><p>確立されたプラットフォームを拡張する場合でも、新しいプロジェクトを開始する場合でも、ベクトル検索のニーズに合わせてElasticsearchを統合することは、具体的かつ長期的なメリットをもたらす戦略的な動きです。実証済みのパフォーマンス上の優位性を備えたElasticsearchは、検索における次のイノベーションの波を支える態勢が整っています。</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[Vector Database]]></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>