k 近傍 (KNN) ベクトルクエリ機能を使用して、ベクトルに基づいて近似最近傍探索を実行できます。この方法により、大規模なデータセット内で、クエリ対象のベクトルと最も類似度の高いデータ項目を見つけることができます。
KNN ベクトルクエリ機能は招待プレビュー段階にあり、デフォルトでは無効になっています。KNN ベクトルクエリ機能を使用するには、チケットを送信してください。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
データテーブルの検索インデックスが作成され、ベクトルフィールドが指定されていること。詳細については、検索インデックスの作成を参照してください。
使用上の注意
Tablestore SDK for Java V5.17.0 以降では、KNN ベクトルクエリ機能がサポートされています。正しいバージョンの Tablestore SDK for Java がインストールされていることを確認してください。
説明Tablestore SDK for Java のバージョン履歴については、Tablestore SDK for Java のバージョン履歴を参照してください。
ベクトルフィールドの数とベクトルフィールドの次元数には制限があります。詳細については、検索インデックスの制限を参照してください。
検索インデックスサーバーには複数のパーティションがあります。検索インデックスサーバーの各パーティションは、クエリ対象のベクトルに最も近い上位 K 個の近傍を返します。パーティションによって返された上位 K 個の近傍は、クライアントノードで集計されます。トークンを使用してすべてのデータをページごとにクエリする場合、レスポンスの合計行数は検索インデックスサーバーのパーティション数に関係します。
パラメーター
パラメーター | 必須 | 説明 |
fieldName | はい | ベクトルフィールドの名前。 |
topK | はい | クエリ対象のベクトルと最も類似度の高い上位 K 個のクエリ結果。topK パラメーターの最大値については、検索インデックスの制限を参照してください。 重要
|
float32QueryVector | はい | 類似度をクエリするベクトル。 |
filter | いいえ | フィルター。KNN ベクトル以外のクエリ条件を組み合わせて使用できます。 |
例
次のサンプルコードは、指定されたベクトルと最も類似度の高い上位 10 個のベクトルをテーブル内でクエリする方法の例を示しています。この例では、上位 10 個のベクトルは、Col_Keyword 列の値が hangzhou で、Col_Long 列の値が 4 未満というクエリ条件を満たす必要があります。
private static void knnVectorQuery(SyncClient client) {
SearchQuery searchQuery = new SearchQuery();
KnnVectorQuery query = new KnnVectorQuery();
query.setFieldName("Col_Vector");
query.setTopK(10); // 指定されたベクトルと最も類似度の高い上位 10 個のベクトルをテーブルから返します。
query.setFloat32QueryVector(new float[]{0.1f, 0.2f, 0.3f, 0.4f});
// 上位 10 個のベクトルのクエリ条件を指定します。Col_Keyword 列の値が hangzhou で、Col_Long 列の値が 4 未満です。
query.setFilter(QueryBuilders.bool()
.must(QueryBuilders.term("Col_Keyword", "hangzhou"))
.must(QueryBuilders.range("Col_Long").lessThan(4))
);
searchQuery.setQuery(query);
searchQuery.setLimit(10);
// スコアに基づいてクエリ結果をソートします。
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setColumns(Arrays.asList("Col_Keyword", "Col_Long"));
searchRequest.setColumnsToGet(columnsToGet);
// Search オペレーションを呼び出します。
SearchResponse resp = client.search(searchRequest);
for (SearchHit hit : resp.getSearchHits()) {
// スコアを表示します。
System.out.println(hit.getScore());
// データを表示します。
System.out.println(hit.getRow());
}
}
関連情報
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます。タームクエリ、複数タームクエリ、すべて一致クエリ、一致クエリ、フレーズ一致クエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、地理クエリ、KNN ベクトルクエリ、ブールクエリ、ネストクエリ、存在クエリ。検索インデックスを作成した後、検索インデックスによって提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数の次元からデータをクエリできます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングの実行を参照してください。
折りたたみ (個別) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。この方法により、指定されたタイプのデータはクエリ結果に 1 回だけ表示されます。詳細については、折りたたみ (個別)を参照してください。
テーブル内のデータを分析する場合、Search オペレーションを呼び出して集計機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数をクエリできます。詳細については、集計およびSQL クエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合、ParallelScan および ComputeSplits オペレーションを呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。