ベクトル類似検索

このトピックでは、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番目の近隣の隣人をクエリしたい場合、Limit2に設定し、Offset8に設定します。 - ConsistencyLevel: 検索中に適用される一貫性レベルを指定します。 - Ignore Growing: 類似度検索で成長中のセグメントを無視するかどうかを示します。デフォルト値はFalseで、検索に成長中のセグメントが関与することを示します。

ベクトル検索の実行

Milvusを使用してベクトル検索を実行します。特定のパーティションで検索する場合は、パーティション名のリストを指定してください。

Milvusは検索のための一貫性レベルの設定をサポートしています。このトピックの例では、一貫性レベルをStrongに設定しています。また、一貫性レベルをBoundedSession、または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)
}