すべてのプロダクト
Search
ドキュメントセンター

Tablestore:KNN ベクタークエリ

最終更新日:Oct 15, 2025

k-最近傍 (KNN) ベクタークエリ機能により、ベクターに基づく近似最近傍探索が可能になります。これにより、大規模なデータセット内でクエリ対象のベクターに最も類似したデータ項目を見つけることができます。

前提条件

使用上の注意

  • 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 パラメーターの最大値に関する詳細については、「多次元インデックスの制限」をご参照ください。

重要

K の値が大きいほど、取得率、クエリの待機時間、およびコストが高くなります。

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());
    }
}

よくある質問

Tablestore KNN ベクタークエリのパフォーマンスを最適化するにはどうすればよいですか?

関連ドキュメント

  • 多次元インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます: term クエリ複数値完全一致検索完全一致検索一致検索フレーズ一致検索プレフィックスクエリ範囲クエリワイルドカード検索ジオクエリKNN ベクタークエリブール値クエリネストされたクエリ、および exists クエリ。多次元インデックスを作成した後、多次元インデックスが提供するクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。

    ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページ分割できます。詳細については、「ソートとページングの実行」をご参照ください。

    折りたたみ (distinct) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されます。詳細については、「折りたたみ (distinct)」をご参照ください。

  • テーブル内のデータを分析したい場合は、Search 操作を呼び出して集約機能を使用するか、SQL クエリ機能を使用できます。たとえば、最大値と最小値、値の合計、および行数をクエリできます。詳細については、「集約」および「SQL クエリ」をご参照ください。

  • 行をソートする必要なくクエリ条件を満たすすべての行を取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。