スカラーインデックス
Milvusはスカラーフィールドとベクトルフィールドの両方を組み合わせたフィルタリング検索をサポートしている。スカラーフィールドを含む検索の効率を高めるために、Milvusはバージョン2.1.0からスカラーフィールドインデックスを導入しました。本記事では、Milvusにおけるスカラーフィールドインデックスの概要について説明し、その意義と実装を理解していただきます。
概要
Milvusでベクトル類似検索を行う場合、論理演算子を使ってスカラーフィールドをブーリアン式に整理することができます。
Milvusはこのようなブーリアン式を含む検索要求を受け取ると、ブーリアン式を抽象構文木(AST)に解析し、属性フィルタリングのための物理計画を生成します。そして、Milvusは各セグメントで物理計画を適用して、フィルタリング結果としてビットセットを生成し、その結果をベクトル検索パラメータとして含めることで、検索範囲を絞り込む。この場合、ベクトル検索の速度は属性フィルタリングの速度に大きく依存する。
セグメント内の属性フィルタリング
スカラーフィールドインデックスは、スカラーフィールドの値を特定の方法で並べ替えることで、属性フィルタリングの速度を確保し、情報検索を高速化する方法である。
スカラー・フィールド・インデックスのアルゴリズム
Milvusはスカラーフィールドインデキシングアルゴリズムにより、低いメモリ使用量、高いフィルタリング効率、短いロード時間の達成を目指している。これらのアルゴリズムはオートインデックスと インバーテッドインデックスの2種類に大別される。
オートインデックス
MilvusはAUTOINDEX
、インデックスタイプを手動で選択する手間を省くオプションを提供しています。create_index
メソッドを呼び出す際、index_type
が指定されていない場合、Milvusはデータ型に基づいて最適なインデックス型を自動的に選択します。
以下の表は、Milvusがサポートしているデータタイプと、それに対応するオートインデックス アルゴリズムの一覧です。
データ型 | オートインデックス アルゴリズム |
---|---|
VARCHAR | 転置インデックス |
INT8 | 転置インデックス |
INT16 | 転置インデックス |
INT32 | 転置インデックス |
INT64 | 転置インデックス |
FLOAT | 転置インデックス |
DOUBLE | 転置インデックス |
転置インデックス
転置インデックスでは、インデックスパラメータを手動で指定してスカラフィールドのインデックスを作成する柔軟な方法を提供します。この方法は、ポイントクエリ、パターンマッチクエリ、フルテキスト検索、JSON 検索、ブール検索、さらにはプレフィックスマッチクエリなど、さまざまなシナリオでうまく機能します。
Milvusに実装されている転置インデックスは、全文検索エンジンライブラリであるTantivyを利用しています。Tantivyを利用することで、Milvusにおける転置インデックスの効率性と高速性を実現しています。
転置インデックスには、用語辞書と転置リストという2つの主要な構成要素があります。用語辞書にはアルファベット順に並べられたトークン化されたすべての単語が含まれ、転置リストには各単語が出現する文書のリストが含まれる。このセットアップにより、ポイント・クエリや範囲クエリは、総当たり検索よりもはるかに高速で効率的になります。
転置インデックス図
転置インデックスを使用する利点は、特に以下の操作において明らかである:
- ポイント・クエリー:例えば、Milvusという単語を含む文書を検索する場合、まず、Milvusが用語辞書に存在するかどうかをチェックする。見つからなければ、その単語を含む文書はない。しかし、見つかった場合は、Milvusに関連付けられた転置リストが検索され、その単語を含む文書が示される。この方法は、並べ替えられた用語辞書によってMilvusという単語を検索する時間の複雑さが大幅に軽減されるため、100万件の文書を総当たりで検索するよりもはるかに効率的である。
- 範囲クエリ:アルファベット順にveryより大きい単語を含む文書を検索するような範囲クエリの効率も、ソートされた用語辞書によって向上する。このアプローチは、総当り検索よりも効率的であり、より迅速で正確な結果を提供する。
テスト結果
Milvusにおけるスカラーインデックスによる性能向上を実証するため、生データに対して転置インデックスと総当たり検索を用いたいくつかの式の性能を比較する実験が行われた。
この実験では、転置インデックスを使用した場合と総当たり検索を使用した場合の2つの条件で様々な式をテストした。公平性を確保するため、毎回同じコレクションを使用し、テスト間で同じデータ配分を維持した。各テストの前に、コレクションを解放し、インデックスを削除して再構築した。さらに、コールドデータとホットデータの影響を最小化するため、各テストの前にウォームクエリを実行し、各クエリを複数回実行して精度を確保した。
100万レコードのデータセットの場合、転置インデックスを使用することで、ポイントクエリで最大30倍の性能向上が得られる。より大きなデータセットの場合、パフォーマンス向上はさらに大きくなる可能性がある。
パフォーマンスに関する推奨事項
Milvusのスカラーフィールドインデックスの能力をフルに活用し、ベクトル類似検索でその力を発揮させるためには、データに基づいて必要なメモリサイズを見積もるモデルが必要かもしれません。
以下の表はMilvusがサポートするすべてのデータタイプの推定関数のリストです。
数値フィールド
データ型 メモリ推定関数 (MB) INT8 行数 *12/ 1024 / 1024 INT16 行数 *12/ 1024 / 1024 INT32 行数 *12/ 1024 / 1024 INT64 行数 *24/ 1024 / 1024 FLOAT32 行数 *12/ 1024 / 1024 DOUBLE 行数 *24/ 1024 / 1024 文字列フィールド
文字列の長さ メモリ推定関数 (MB) (0, 8] 行数 *128/ 1024 / 1024 (8, 16] 行数 *144/ 1024 / 1024 (16, 32] 行数 *160/ 1024 / 1024 (32, 64] 行数 *192/ 1024 / 1024 (64, 128] 行数 *256/ 1024 / 1024 (128, 65535] 行数 *strLen * 1.5/ 1024 / 1024
次は
スカラー・フィールドにインデックスを作成するには、スカラーにインデックスを作成するを参照してください。
上記の関連用語とルールについては、以下を参照。