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

Tablestore:KNN ベクトルクエリ

最終更新日:Dec 28, 2024

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

KNN ベクトルクエリ機能は招待プレビュー中で、デフォルトでは無効になっています。KNN ベクトルクエリ機能を使用するには、チケットを送信してください。

前提条件

使用上の注意

  • 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 の値が大きいほど、再現率、クエリレイテンシ、およびコストが高くなります。

  • topK パラメーターの値が SearchQuery の limit パラメーターの値より小さい場合、サーバーは自動的に limit パラメーターの値を topK パラメーターの値として使用します。

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

関連情報