k 近傍 (KNN) ベクタークエリ機能により、ベクターに基づく近似最近傍検索が可能になります。これにより、大規模なデータセット内でクエリされたベクターに最も類似したデータ項目を見つけることができます。
前提条件
OTSClient インスタンスが初期化されていること。 詳細については、「Tablestore クライアントを初期化する」をご参照ください。
データテーブルに多次元インデックスが作成され、ベクターフィールドが設定されていること。 詳細については、「多次元インデックスを作成する」をご参照ください。
使用上の注意
KNN ベクタークエリ機能は、バージョン 5.5.0 以降の Tablestore SDK for Node.js でサポートされています。サポートされているバージョンの Tablestore SDK for Node.js がインストールされていることを確認してください。
説明Tablestore SDK for Node.js のバージョン履歴については、「Tablestore SDK for Java のバージョン履歴」をご参照ください。
ベクターフィールドの数とベクターフィールドのディメンション数には制限があります。 詳細については、「多次元インデックスの制限」をご参照ください。
多次元インデックスサーバーには複数のパーティションがあります。多次元インデックスサーバーの各パーティションは、クエリしたいベクターに最も近い上位 K 個の近傍を返します。パーティションによって返された上位 K 個の最近傍は、クライアントノードで集約されます。トークンを使用してすべてのデータをページ単位でクエリする場合、応答の合計行数は多次元インデックスサーバーのパーティション数に関連します。
パラメーター
パラメーター | 必須 | 説明 |
fieldName | はい | ベクターフィールドの名前。 |
topK | はい | クエリしたいベクターと最も類似度が高い上位 K 個のクエリ結果。 topK パラメーターの最大値については、「多次元インデックスの制限」をご参照ください。 重要 K の値が大きいほど、取得率、クエリのレイテンシ、およびコストが高くなります。 |
float32QueryVector | はい | 類似度をクエリしたいベクター。 |
filter | いいえ | フィルター。KNN ベクタークエリ条件ではないクエリ条件の組み合わせを使用できます。 |
例
次のサンプルコードは、データテーブル内の特定のベクターの 10 個の最近傍をクエリする方法の例を示しています。この例では、最近傍ベクターの col_keyword 列の値は「0」と等しく、最近傍ベクターの col_long 列の値は 0 から 50 の間でなければなりません。
const tableName = "<TABLE_ANME>"
const indexName = "<SEARCH_INDEX_NAME>"
async function knnVectorQuery() {
return new Promise(function (resolve, reject) {
let params = {
tableName: tableName,
indexName: indexName,
searchQuery: {
offset: 0,
limit: 10,
query: {
queryType: TableStore.QueryType.KNN_VECTOR_QUERY,
query: {
fieldName: "col_vector",
topK: TableStore.Long.fromNumber(10),
float32QueryVector: [1.0, 1.1, 1.2, -1.3],
filter: {
queryType: TableStore.QueryType.BOOL_QUERY,
query: {
mustQueries: [
{
queryType: TableStore.QueryType.RANGE_QUERY,
query: {
fieldName: "col_long",
rangeFrom: TableStore.Long.fromNumber(0),
includeLower: true,
rangeTo: TableStore.Long.fromNumber(50),
includeUpper: true,
}
},
{
queryType: TableStore.QueryType.TERM_QUERY,
query: {
fieldName: "col_keyword",
term: "0",
}
},
],
}
},
},
},
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_DESC // スコアに基づいてクエリ結果を降順にソートします。
}
}
],
},
getTotalCount: false,
},
columnToGet: {
returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
returnNames: ["col_long", "col_keyword"]
},
timeoutMs: 10000,
}
client.search(params, function (err, data) {
if (err) {
console.log('search error:', err.toString());
reject(err);
} else {
console.log('RequestId:', data.RequestId);
for (let i = 0; i < data.searchHits.length; i++) {
let hit = data.searchHits[i]
console.log('Score:', hit.score, 'Row:', hit.row);
}
resolve(data)
}
});
})
}
knnVectorQuery();よくある質問
関連ドキュメント
多次元インデックスでは、次のクエリタイプがサポートされています: term クエリ、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックスクエリ、範囲クエリ、ワイルドカード検索、ブール値クエリ、ジオクエリ、ネストされたクエリ、ベクタークエリ、および exists クエリ。ビジネス要件に基づいてクエリタイプを選択してデータをクエリできます。
クエリ条件を満たす行をソートまたはページ分割したい場合は、ソートおよびページング機能を使用できます。詳細については、「ソートとページング」をご参照ください。
特定の列に基づいて結果セットを折りたたみたい場合は、折りたたみ (distinct) 機能を使用できます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されます。詳細については、「折りたたみ (distinct)」をご参照ください。
データテーブル内のデータを分析したい場合、たとえば、極値、合計、総行数を取得するなど、集約操作を実行したり、SQL 文を実行したりできます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なく、クエリ条件を満たすすべての行を迅速に取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。