search-ann-benchmarkにElasticsearch 9.2のDiskBBQを追加

ベクトル検索エンジンの性能評価ツールsearch-ann-benchmarkで、Elasticsearch 9.2で追加されたDiskBBQ(bbq_disk)インデックスタイプの評価を追加しました。

DiskBBQとは

DiskBBQは、Elasticsearch 9.2で導入された新しいベクトルインデックスタイプです。従来のBBQ(Better Binary Quantization)がメモリベースのHNSWグラフを使用するのに対し、DiskBBQはディスクベースで動作します。

これにより、メモリ使用量を抑えつつ大規模なベクトルデータを扱えるようになります。ただし、ディスクアクセスが発生するため、検索速度とのトレードオフがあります。

search-ann-benchmarkの変更内容

主な変更点は以下の3つです。

CLIオプションの追加

--quantizationオプションにbbq_diskを追加しました。これで、コマンドラインからDiskBBQを使用したベンチマークを実行できます。

search-ann-benchmark run elasticsearch \
  --target 100k-768-m32-efc200-ef100-ip \
  --version 9.2.3 \
  --quantization bbq_disk

インデックス作成ロジックの調整

DiskBBQは従来のHNSWパラメータ(mef_construction)をサポートしないため、インデックス作成時にこれらのパラメータを除外するように修正しました。

GitHub Actionsワークフローの追加

DiskBBQ専用のベンチマークワークフローを追加しました。Elasticsearch 9.2.3を使用して、100k、1M、5Mのデータセットに対してテストできます。

大規模データセットでの効果

DiskBBQは、メモリ使用量の削減が主な目的のため、小規模なデータセットでは従来のbbq_hnswとの差があまり出ないかもしれません。5M以上のベクトルを扱うような大規模なデータセットで、メモリ効率の違いがより明確になると思います。

    search-ann-benchmarkにベクトル検索エンジンを追加

    ベクトル検索エンジンの性能評価ツールsearch-ann-benchmarkに、4つのエンジンを追加しました。

    追加したエンジン

    今回追加したのは以下の4つです。

    ClickHouse

    ClickHouseは、高速なOLAPデータベースとして知られていますが、最近はベクトル検索機能も提供しています。今回の実装では、MergeTreeエンジンとvector_similarityインデックスを使って、HNSW(Hierarchical Navigable Small World)によるANN検索を行います。

    ClickHouseはHTTPインターフェースを介して操作でき、大量のデータをバッチ処理するのに向いています。既存のClickHouse環境があれば、追加のインフラなしでベクトル検索を始められるのがメリットです。

    LanceDB

    LanceDBは、組み込み型のベクトルデータベースです。SQLiteのようにファイルベースで動作するため、Dockerなどのコンテナを立ち上げる必要がありません。

    Python環境で直接動作するため、セットアップが簡単で、ローカル環境でのプロトタイピングやテストに便利です。IVF-PQインデックスを使った近似最近傍探索をサポートしています。

    Redis Stack

    Redis Stackは、RedisにベクトルDB機能を追加したものです。RediSearchモジュールを使って、HNSWインデックスによるベクトル検索ができます。

    Redisはインメモリデータベースなので、検索速度は高速です。既存のRedisインフラを活用できる点と、KVストアとしての機能とベクトル検索を同じ基盤で使えるのが特徴です。

    Vald

    Valdは、Yahoo! JAPANが開発した分散ベクトル検索エンジンです。NGT(Neighborhood Graph and Tree)というアルゴリズムを使っており、高次元ベクトルに対して高い性能を発揮します。

    Kubernetesネイティブなアーキテクチャで、大規模な分散環境での運用を想定した設計になっています。gRPCベースのAPIを提供しています。

    ベンチマーク実行

    各エンジンのベンチマークはGitHub Actionsで自動実行されるようになっています。手動でトリガーすることも可能で、100k、1M、5Mのデータセットサイズに対してテストできます。

    これで、search-ann-benchmarkでサポートするエンジンは合計12種類になりました。

    • Elasticsearch
    • OpenSearch
    • Qdrant
    • Milvus
    • Weaviate
    • Vespa
    • pgvector
    • Chroma
    • ClickHouse(New)
    • LanceDB(New)
    • Redis Stack(New)
    • Vald(New)

    ベクトル検索エンジンは選択肢が増えてきているので、自分の用途に合ったものを選ぶ際の参考になればと思います。

    関連リンク

    ベクトル検索エンジンの性能検証

    以前からcodelibs/search-ann-benchmarkで、VespaやElasticsearchなどのベクトル検索の性能評価を行っていましたが、notebookで管理していたため、メンテしていくのも最近辛くなり、放置してました…。

    放置しておくと、最近の動向などにもキャッチアップできなくなってくるので、今回、Claude Codeを使って、ipynbだったファイルたちを、uv管理のPythonプロジェクトとして、整理を行いました。Claude Codeで管理しやすくすることで、今後、各検索エンジンのバージョンアップにも追随しやすくなるはずです。

    そんな感じで、再運用を始めて、ベンチマーク結果を見たら、以前は、Vespaとqdrantの2強だったのが、Elasticsearchも同等の性能が出せるようになっていました。Project Panamaとかで、Elasticsearchが追いつけるのかな?とか思っていたけど、追いついたようですね。すばらしい。OpenSearchも以前より速くなった気はするけど、まだ、何か改善が必要そうな結果ではあるので、頑張って欲しいところである。

    ということで、放置していたベクトル検索の性能評価を再始動して、今後もメンテはできると思うので、興味があれば、たまに見てみてください。他にも追加できそうな検索エンジンがあれば、追加すると思います。