Java 向け Tablestore SDK を使用したベクトル検索では、ベクトルの類似度に基づいて検索インデックス内の最も近いデータを返します。また、スコアのしきい値、候補数、非ベクトルフィルターをサポートします。
前提条件
Java 向け Tablestore SDK をインストールして、クライアントを初期化します。ベクトル検索にはバージョン 5.17.0 以降が必要です。
minScoreまたはnumCandidatesを設定するには、バージョン 5.17.5 以降を使用してください。
機能の説明
ベクトル検索では、クエリベクトルとベクトルフィールド内のベクトルの間で近似最近傍 (ANN) 探索を実行します。Tablestore は、検索インデックスの作成時に設定された距離メトリックで結果をスコアリングし、最も近いデータを返します。フィールド値に一致するクエリとは異なり、ベクトル検索はベクトル間の距離から類似度を判定します。
search を呼び出し、query に KnnVectorQuery を設定します。
SearchResponse search(SearchRequest request)
次の例では、embedding フィールド内で [1.0, 0.0, 0.0, 0.0] に最も近い 3 つのベクトルを取得します。結果はスコアの降順でソートされます。
String tableName = "example_table";
String indexName = "example_index";
KnnVectorQuery query = new KnnVectorQuery();
query.setFieldName("embedding");
query.setTopK(3);
query.setFloat32QueryVector(new float[]{1.0f, 0.0f, 0.0f, 0.0f});
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(query);
searchQuery.setLimit(3);
searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
System.out.println(hit.getScore() + ": " + hit.getRow());
}
ベクトルフィールドの数とディメンション、および topK には制限があります。詳細については、「Search index limits」をご参照ください。
パラメータ
検索リクエスト
request は SearchRequest オブジェクトであり、次のパラメータが含まれます。
|
名前 |
型 |
説明 |
|
tableName (必須) |
String |
テーブル名。 |
|
indexName (必須) |
String |
検索インデックス名。 |
|
searchQuery (必須) |
SearchQuery |
クエリ条件および共通のクエリ設定。 |
|
columnsToGet (オプション) |
SearchRequest.ColumnsToGet |
返される列の設定。このパラメータを設定しない場合、プライマリキー列のみが返されます。 |
|
timeoutInMillisecond (オプション) |
int |
リクエストレベルのクエリタイムアウト (ミリ秒)。デフォルトは |
|
routingValues (オプション) |
|
カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合は、このパラメータを設定しないでください。 |
クエリ設定
request.searchQuery は SearchQuery オブジェクトであり、次のパラメータが含まれます。
|
名前 |
型 |
説明 |
|
query (必須) |
Query |
クエリ条件。ベクトル検索の場合、このパラメータを |
|
offset (オプション) |
Integer |
クエリを開始する位置。 |
|
limit (オプション) |
Integer |
返す行の最大数。このパラメータを |
|
highlight (オプション) |
Highlight |
サマリーおよびハイライトの設定。ベクトルフィールドはサマリーとハイライトをサポートしません。 |
|
collapse (オプション) |
Collapse |
指定した列に基づき、結果の重複排除を行うための折りたたみ設定。 |
|
sort (オプション) |
Sort |
結果のソート順。スコアでソートするには |
|
trackTotalCount (オプション) |
int |
カウントする一致行数の最大値。デフォルトは |
|
filter (オプション) |
SearchFilter |
|
|
aggregationList (オプション) |
|
集約の設定。 |
|
groupByList (オプション) |
|
グルーピングの設定。 |
|
token (オプション) |
byte[] |
ページネーション トークン。追加のデータを取得するには、このパラメータに前回のレスポンスの |
ベクトルクエリ条件
request.searchQuery.query は KnnVectorQuery オブジェクトであり、次のパラメータが含まれます。
|
名前 |
型 |
説明 |
|
fieldName (必須) |
String |
ベクトルフィールド名。フィールドは Vector 型である必要があり、クエリベクトルのディメンションは、検索インデックスの作成時に設定したディメンションと一致する必要があります。 |
|
topK (必須) |
Integer |
取得する最近傍ベクトルの数。最大: |
|
float32QueryVector (必須) |
float[] |
類似度の計算に使用する Float32 のクエリベクトル。配列長はベクトルフィールドのディメンションと一致する必要があります。 |
|
filter (オプション) |
Query |
ベクトル検索の結果が満たす必要がある非ベクトルのクエリ条件。複数の非ベクトル |
|
weight (オプション) |
Float |
ベクトルクエリの関連性の重み。値は |
|
minScore (オプション) |
Float |
最小スコアのしきい値。値は |
|
numCandidates (オプション) |
Integer |
最近傍を計算する際に、各インデックスパーティションでアクセスする候補数。有効な値: |
返される列
request.columnsToGet は SearchRequest.ColumnsToGet オブジェクトであり、次のパラメータが含まれます。
|
名前 |
型 |
説明 |
|
columns (オプション) |
|
返す属性列。 |
|
returnAll (オプション) |
boolean |
テーブル内のすべての属性列を返すかどうかを指定します。デフォルト: |
|
returnAllFromIndex (オプション) |
boolean |
インデックス化されたすべての属性列を返すかどうかを指定します。デフォルト: |
レスポンス
検索レスポンス
search は SearchResponse オブジェクトを返します。次の表に、主要フィールドを示します。
|
名前 |
型 |
説明 |
|
totalCount |
long |
一致する行数。値は |
|
rows |
|
このクエリで返される行。値は |
|
searchHits |
|
検索ヒット。値を取得するには |
|
nextToken |
byte[] |
次ページのトークン。値は |
|
isAllSuccess |
boolean |
すべてのインデックスパーティションがクエリされたかどうかを示します。値は |
検索ヒット
response.searchHits[] の各要素は SearchHit オブジェクトであり、次の主要フィールドが含まれます。
|
名前 |
型 |
説明 |
|
row |
Row |
一致した行。値は |
|
score |
Double |
ベクトルクエリのスコア。値は |
例
非ベクトル条件と最小スコアによるフィルタリング
filter を使用して最近傍が非ベクトルのクエリ条件を満たすように指定し、minScore を使用してスコアがしきい値以下のデータを除外します。次の例では、category が book、price が 4 未満で、ベクトルのスコアが 0.6 を超えるデータのみを返します。
KnnVectorQuery filteredQuery = new KnnVectorQuery();
filteredQuery.setFieldName("embedding");
filteredQuery.setTopK(10);
filteredQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
filteredQuery.setMinScore(0.6f);
filteredQuery.setFilter(QueryBuilders.bool()
.must(QueryBuilders.term("category", "book"))
.must(QueryBuilders.range("price").lessThan(4)));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(filteredQuery);
searchQuery.setLimit(10);
候補数の調整
numCandidates を設定すると、最近傍を計算する際に各インデックスパーティションでアクセスする候補セットを拡大できます。次の例では、4 つの候補から最も近い 3 つのベクトルを取得します。
KnnVectorQuery candidateQuery = new KnnVectorQuery();
candidateQuery.setFieldName("embedding");
candidateQuery.setTopK(3);
candidateQuery.setFloat32QueryVector(
new float[]{1.0f, 0.0f, 0.0f, 0.0f});
candidateQuery.setNumCandidates(4);
SearchQuery candidateSearchQuery = new SearchQuery();
candidateSearchQuery.setQuery(candidateQuery);
candidateSearchQuery.setLimit(3);