k 近傍 (KNN) ベクトルクエリ機能を使用して、ベクトルに基づいて近似最近傍探索を実行できます。この方法では、大規模なデータセット内で、クエリ対象のベクトルと最も類似性の高いデータ項目を見つけることができます。
KNN ベクトルクエリ機能は招待プレビュー段階にあり、デフォルトでは無効になっています。KNN ベクトルクエリ機能を使用するには、チケットを送信 してください。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成され、ベクトルフィールドが指定されていること。詳細については、検索インデックスの作成を参照してください。
使用上の注意
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 パラメーターの最大値については、検索インデックスの制限を参照してください。 重要
|
float32_query_vector | はい | 類似性をクエリするベクトル。 |
filter | いいえ | フィルター。KNN ベクトルクエリ条件ではないクエリ条件の組み合わせを使用できます。 |
例
次のサンプルコードは、指定されたベクトルと最も類似性の高い上位 10 個のベクトルをテーブル内でクエリする方法の例を示しています。この例では、上位 10 個のベクトルは、col_keyword 列の値が 0 で、col_long 列の値が 0 から 50 の範囲内であるというクエリ条件を満たす必要があります。
def knn_vector_query(client):
# col_keyword 列の値が "0" と等しく、col_long 列の値が 0 から 50 の範囲内であるというクエリ条件を定義します。
filter_query = BoolQuery(
must_queries=[
TermQuery(field_name='col_keyword', column_value="0"),
RangeQuery(field_name='col_long', range_from=0, range_to=50),
]
)
# col_vector フィールドで KNN ベクトルクエリを実行します。上位 10 個のベクトルをクエリし、クエリベクトルを指定します。
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)
for row in search_response.rows:
print(row)
関連情報
検索インデックスを使用してデータをクエリする場合は、次のクエリメソッドを使用できます。タームクエリ、タームズクエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、地理クエリ、ブールクエリ、KNN ベクトルクエリ、ネストされたクエリ、存在クエリ。検索インデックスによって提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数の次元からデータをクエリできます。
ソート機能とページング機能を使用して、クエリ条件を満たす行をソートまたはページングできます。詳細については、ソートとページングを参照してください。
折りたたみ (個別) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。この方法では、指定されたタイプのデータはクエリ結果に一度だけ表示されます。詳細については、折りたたみ (個別)を参照してください。
データテーブル内のデータを分析する場合は、検索操作の集計機能を使用するか、SQL ステートメントを実行できます。たとえば、最小値、最大値、合計、行の総数などを取得できます。詳細については、集計とSQL クエリを参照してください。
行をソートする必要なく、クエリ条件を満たすすべての行を取得する場合は、ParallelScan 操作と ComputeSplits 操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。