k-最近傍 (KNN) ベクタークエリ機能を使用すると、ベクターに基づいて近似最近傍探索を実行できます。これにより、大規模なデータセット内で、クエリ対象のベクターに最も類似したデータ項目を見つけることができます。
前提条件
データテーブルの多次元インデックスを作成し、ベクターフィールドを指定します。
使用上の注意
最新バージョンの Tablestore SDK for Go がインストールされていることを確認してください。詳細については、「Tablestore SDK for Go をインストールする」をご参照ください。
ベクターフィールドの数とベクターフィールドのディメンション数には制限があります。詳細については、「多次元インデックスの制限」をご参照ください。
多次元インデックスサーバーには複数のパーティションがあります。多次元インデックスサーバーの各パーティションは、クエリ対象のベクターに最も近い上位 K 個の近傍を返します。パーティションによって返された上位 K 個の最近傍は、クライアントノードで集約されます。トークンを使用してすべてのデータをページ単位でクエリする場合、応答の合計行数は多次元インデックスサーバーのパーティション数に関連します。
パラメーター
パラメーター | 必須 | 説明 |
FieldName | はい | ベクターフィールドの名前。 |
TopK | はい | クエリ対象のベクターと最も類似度が高い上位 K 件のクエリ結果。TopK パラメーターの最大値については、「多次元インデックスの制限」をご参照ください。 重要 K の値が大きいほど、取得率、クエリのレイテンシ、およびコストが高くなります。 |
Float32QueryVector | はい | 類似度をクエリするベクター。 |
Filter | いいえ | フィルター。KNN ベクタークエリ条件以外のクエリ条件の組み合わせを使用できます。 |
例
次のサンプルコードは、指定したベクターと最も類似度が高いテーブル内の上位 10 個のベクターをクエリする方法を示しています。この例では、上位 10 個のベクターは、col_keyword 列の値が hangzhou であるという条件を満たす必要があります。
func query(client *tablestore.TableStoreClient) {
searchQuery := search.NewSearchQuery()
searchQuery.Query = &search.KnnVectorQuery{
FieldName: "col_vector",
TopK: proto.Int32(10),
Float32QueryVector: []float32{-1.4, 1, 1, 1.2},
Filter: &search.BoolQuery{
ShouldQueries: []search.Query{
&search.TermQuery{
FieldName: "col_keyword",
Term: "hangzhou",
},
},
},
}
searchQuery.Sort = &search.Sort{
Sorters: []search.Sorter{
search.NewScoreSort(), // スコアに基づいてクエリ結果をソートします。
},
}
searchRequest := &tablestore.SearchRequest{
SearchQuery: searchQuery,
TableName: "<TABLE_NAME>",
IndexName: "<SEARCH_INDEX_NAME>",
ColumnsToGet: &tablestore.ColumnsToGet{Columns: []string{
"col_keyword",
"col_long",
}},
}
if resp, err := client.Search(searchRequest); err != nil {
fmt.Println("float32 vector query failed: ", err)
} else {
for _, hit := range resp.SearchHits {
fmt.Println("score:", *hit.Score)
jsonBody, err := json.Marshal(hit.Row)
if err != nil {
panic(err)
}
fmt.Println("row: ", string(jsonBody))
}
}
}よくある質問
関連資料
多次元インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます: term クエリ、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックスクエリ、範囲クエリ、ワイルドカード検索、ジオクエリ、ブールクエリ、KNN ベクタークエリ、ネストされたクエリ、および exists クエリ。ビジネス要件に基づいて、多次元インデックスが提供するクエリメソッドを使用して、複数のディメンションからデータをクエリできます。
ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページ分割できます。詳細については、「ソートとページング」をご参照ください。
折りたたみ (distinct) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されるようになります。詳細については、「折りたたみ (distinct)」をご参照ください。
データテーブル内のデータを分析したい場合は、Search 操作の集約機能を使用するか、SQL 文を実行できます。たとえば、最小値、最大値、合計、および総行数を取得できます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なくクエリ条件を満たすすべての行を取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャンを実行する」をご参照ください。