KnnVectorQuery を使用して、数値ベクトルによる近似最近傍探索を実行し、大規模なデータセット内で最も類似したデータ項目を検索します。
前提条件
Tablestore クライアントの初期化が完了していること。
データテーブルに多次元インデックスを作成し、ベクトルフィールドが設定されていること。
注意事項
ベクトル検索機能は、Tablestore SDK for Java 5.17.0 以降でサポートされています。正しい SDK バージョンがインストールされていることを確認してください。
説明Tablestore SDK for Java のバージョン履歴の詳細については、「Java SDK のバージョン履歴」をご参照ください。
ベクトルフィールドのタイプ、ディメンション、およびその他のプロパティの数には制限があります。詳細については、「多次元インデックスの制限」をご参照ください。
多次元インデックスはサーバー側でパーティション分割されます。各パーティションは独自の TopK 最近傍を返し、結果はクライアントノードで集約されます。したがって、トークンを使用してすべてのデータをページングする場合、返される行の総数はサーバー側のパーティション数に依存します。
パラメーター
パラメーター | 必須 | 説明 |
fieldName | はい | ベクトルフィールドの名前。 |
topK | はい | 返す最近傍の数。最大値については、「多次元インデックスの制限」をご参照ください。 重要 K の値を大きくすると再現率は向上しますが、クエリのレイテンシーとコストが増加します。 |
float32QueryVector | はい | 類似検索に使用するベクトル。 |
minScore | いいえ | スコアのしきい値。この値より大きいスコアを持つ行のみを返します。値は 0 以上である必要があります。デフォルト値は 0 です。 |
filter | いいえ | ベクトル以外のクエリ条件の任意の組み合わせをサポートするクエリフィルター。 |
例
この例では、指定されたベクトルに最も近い 10 個の近傍をクエリします。このクエリでは、0.1 より大きい類似度スコアが必要で、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); // 上位 K 個の最近傍を返します。
query.setMinScore(0.1f); // スコアが 0.1 より大きい行のみを返します。
query.setFloat32QueryVector(new float[]{0.1f, 0.2f, 0.3f, 0.4f});
// 最近傍は、Col_Keyword = 'hangzhou' AND 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);
// 検索操作を呼び出します。
SearchResponse resp = client.search(searchRequest);
for (SearchHit hit : resp.getSearchHits()) {
// スコアを出力します。
System.out.println(hit.getScore());
// 行データを出力します。
System.out.println(hit.getRow());
}
}よくある質問
関連トピック
多次元インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます:完全一致検索、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックス検索、範囲クエリ、ワイルドカード検索、ジオクエリ、KNN ベクトルクエリ、ブール値クエリ、ネストされたクエリ、および exists クエリ。多次元インデックスを作成した後、多次元インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
ソートとページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、「ソートとページングの実行」をご参照ください。
折りたたみ (distinct) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されます。詳細については、「折りたたみ (distinct)」をご参照ください。
テーブル内のデータを分析したい場合は、Search 操作を呼び出して集約機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、行数などをクエリできます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なくクエリ条件を満たすすべての行を取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。