k-最近傍 (KNN) ベクタークエリ機能により、ベクターに基づく近似最近傍探索が可能になります。これにより、大規模なデータセット内でクエリ対象のベクターに最も類似したデータ項目を見つけることができます。
前提条件
データテーブルに対して多次元インデックスが作成され、ベクターフィールドが指定されている。
使用上の注意
Tablestore SDK for Python V5.4.4 以降は、KNN ベクタークエリ機能をサポートしています。最新バージョンの Tablestore SDK for Python を使用することを推奨します。
説明Tablestore SDK for Python のバージョン履歴の詳細については、「Tablestore SDK for Python のバージョン履歴」をご参照ください。
ベクターフィールドの数とベクターフィールドのディメンション数には制限があります。詳細については、「多次元インデックスの制限」をご参照ください。
多次元インデックスサーバーには複数のパーティションがあります。多次元インデックスサーバーの各パーティションは、クエリしたいベクターに最も近い上位 K 個の近傍を返します。パーティションから返された上位 K 個の最近傍は、クライアントノードで集約されます。トークンを使用してすべてのデータをページ単位でクエリする場合、応答内の合計行数は多次元インデックスサーバーのパーティション数に関連します。
パラメーター
パラメーター | 必須 | 説明 |
field_name | はい | ベクターフィールドの名前。 |
top_k | はい | クエリしたいベクターと最も類似度が高い上位 k 件のクエリ結果。top_k パラメーターの最大値の詳細については、「多次元インデックスの制限」をご参照ください。 重要 k の値が大きいほど、取得率、クエリの待機時間、およびコストが高くなります。 |
float32_query_vector | はい | 類似度をクエリしたいベクター。 |
filter | いいえ | フィルター。KNN ベクタークエリ条件ではないクエリ条件の組み合わせを使用できます。 |
例
次のサンプルコードは、テーブル内で指定されたベクターと最も類似度が高い上位 10 個のベクターをクエリする方法の例を示しています。この例では、上位 10 個のベクターは次のクエリ条件を満たす必要があります。col_keyword 列の値が 0 であり、col_long 列の値が 0 から 50 の範囲内であること。
def knn_vector_query(client):
filter_query = BoolQuery(
must_queries=[
TermQuery(field_name='col_keyword', column_value="0"),
RangeQuery(field_name='col_long', range_from=0, range_to=50),
]
)
query = KnnVectorQuery(field_name='col_vector', top_k=10, float32_query_vector=[1.0, 1.1, 1.2, -1.3], filter=filter_query)
# スコアに基づいてクエリ結果をソートします。
sort = Sort(sorters=[ScoreSort(sort_order=SortOrder.DESC)])
search_query = SearchQuery(query, limit=10, get_total_count=False, sort=sort)
search_response = client.search(
table_name='<TABLE_NAME>',
index_name='<SEARCH_INDEX_NAME>',
search_query=search_query,
columns_to_get=ColumnsToGet(column_names=["col_keyword", "col_long"], return_type=ColumnReturnType.SPECIFIED)
)
print("requestId:", search_response.request_id)
# 使用している Tablestore SDK for Python で search_hits を取得できない場合は、Tablestore SDK for Python V6.1.0 以降を使用してください。
for hit in search_response.search_hits:
# 行データを取得します。
row = hit.row
print(row)
# スコアを取得します。
score = hit.score
print(score)よくある質問
関連ドキュメント
多次元インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます: term クエリ、複数値完全一致検索、完全一致検索、一致検索、フレーズ一致検索、プレフィックスクエリ、範囲クエリ、ワイルドカード検索、ジオクエリ、ブール値クエリ、KNN ベクタークエリ、ネストされたクエリ、および exists クエリ。ビジネス要件に基づいて、多次元インデックスが提供するクエリメソッドを使用して、複数のディメンションからデータをクエリできます。
ソートおよびページング機能を使用して、クエリ条件を満たす行をソートまたはページ分割できます。詳細については、「ソートとページング」をご参照ください。
折りたたみ (distinct) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に一度だけ表示されます。詳細については、「折りたたみ (distinct)」をご参照ください。
データテーブル内のデータを分析したい場合は、Search 操作の集約機能を使用するか、SQL 文を実行できます。たとえば、最小値、最大値、合計、および総行数を取得できます。詳細については、「集約」および「SQL クエリ」をご参照ください。
行をソートする必要なくクエリ条件を満たすすべての行を取得したい場合は、ParallelScan および ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、「並列スキャン」をご参照ください。