ベクトル類似検索
このトピックでは、Milvusでエンティティ検索を実行する方法について説明します。
Milvusのベクトル類似検索は、クエリベクトルとコレクション内のベクトルとの間の距離を計算し、類似度が高い結果を返します。また、スカラーフィールドやプライマリキーフィールドをフィルタリングするためのブール式を指定することで、混合検索も行うことができます。
次の例では、2000行のデータセット(プライマリキーの本ID、スカラーフィールドの単語の頻度、ベクトルフィールドの本の説明)に対してベクトル類似検索を実行する方法を示しています。これは、ベクトル化された説明に基づいて特定の本を検索するシナリオをシミュレートしています。Milvusは、定義したクエリベクトルと検索パラメータに基づいて、最も類似した結果を返します。
コレクションのロード
ベクトル類似検索を実行する前に、Milvusはすべての検索とクエリの操作をメモリで実行します。ベクトル類似検索を実行する前に、コレクションをメモリにロードしてください。
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("failed to load collection:", err.Error())
}
検索パラメータの準備
検索シナリオに適したパラメータを準備してください。次の例では、ユークリッド距離を使用して距離を計算し、IVF_FLATインデックスによって構築された10個の最も近いクラスタからベクトルを取得することを定義しています。
sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
パラメータ | 説明 | オプション |
---|---|---|
NewIndex*SearchParam func |
異なるインデックスタイプに基づいてentity.SearchParam を作成するための関数。 |
浮動小数点ベクトルの場合: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) 2進ベクトルの場合:- NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
前の関数によって返されるインデックス固有の検索パラメータ。 | 詳細については、ベクトルインデックスを参照してください。 |
opt |
近似最近傍探索(ANN検索)のオプション。 | - Limit : 返されるエンティティの数を指定します。 - Offset : 検索中にスキップするエンティティの数を指定します。このパラメータとLimit の合計は16384未満である必要があります。たとえば、ベクトルの9番目と10番目の近隣の隣人をクエリしたい場合、Limit を2 に設定し、Offset を8 に設定します。 - ConsistencyLevel : 検索中に適用される一貫性レベルを指定します。 - Ignore Growing : 類似度検索で成長中のセグメントを無視するかどうかを示します。デフォルト値はFalse で、検索に成長中のセグメントが関与することを示します。 |
ベクトル検索の実行
Milvusを使用してベクトル検索を実行します。特定のパーティションで検索する場合は、パーティション名のリストを指定してください。
Milvusは検索のための一貫性レベルの設定をサポートしています。このトピックの例では、一貫性レベルをStrong
に設定しています。また、一貫性レベルをBounded
、Session
、またはEventually
に設定することもできます。Milvusの四つの一貫性レベルの詳細については、一貫性を参照してください。
searchResult, err := milvusClient.Search(
context.Background(), // ctx
"book", // CollectionName
[]string{}, // partitionNames
"", // expr
[]string{"book_id"}, // outputFields
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
"book_intro", // vectorField
entity.L2, // metricType
10, // topK
sp, // sp
opt,
)
if err != nil {
log.Fatal("コレクションの検索に失敗しました:", err.Error())
}
パラメータ | 説明 | オプション |
---|---|---|
ctx |
APIコールプロセスを制御するために使用されるコンテキスト | N/A |
CollectionName |
ロードされるコレクションの名前 | N/A |
partitionNames |
ロードされるパーティション名のリスト。空の場合、すべてのパーティションを検索します | N/A |
expr |
プロパティをフィルタリングするためのブール式 | 詳細についてはブール式のルールを参照してください |
output_fields |
返されるフィールドの名前 | N/A |
vectors |
検索されるベクトル | N/A |
vectorField |
検索されるフィールドの名前 | N/A |
metricType |
検索に使用されるメトリックタイプ | このパラメータはインデックスを構築する際に使用されたメトリックタイプと同じでなければなりません |
topK |
返される結果の数。この値とopt 内のoffset の合計は16384未満でなければなりません |
N/A |
sp |
インデックスに固有のentity.SearchParam |
N/A |
最も類似したベクトルの主キー値と距離を確認してください。
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}
検索が完了したら、Milvusにロードされたコレクションを解放してメモリ消費を減らします。
err := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // CollectionName
)
if err != nil {
log.Fatal("コレクションの解放に失敗しました:", err.Error())
}
制限事項
機能 | 最大制限 |
---|---|
コレクション名の長さ | 255 文字 |
コレクション内のパーティション数 | 4,096 |
コレクション内のフィールド数 | 256 |
コレクション内のシャード数 | 256 |
ベクトルの次元数 | 32,768 |
上位K | 16,384 |
ターゲット入力ベクトルの数 | 16,384 |
ミックス検索の実行
ミックス検索は基本的に属性フィルタリングを行ったベクトル検索です。スカラーフィールドまたはプライマリキーフィールドをフィルタリングするためのブール式を指定することで、特定の条件に基づいて検索を制限することができます。
次の例では、書籍のベクトル化された紹介を基に特定の本を検索したいが、特定の単語数の範囲内の書籍のみを取得したい場合を示しています。そのため、検索パラメータでword_count
フィールドをフィルタリングするブール式を指定します。Milvusは、式に一致するエンティティ内の類似ベクトルのみを検索することになります。
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
searchResult, err := milvusClient.Search(
context.Background(),
"book",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("コレクションの検索に失敗しました:", err.Error())
}
返された結果を確認します。
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}