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

Tablestore:KNN ベクトルクエリ

最終更新日:Dec 28, 2024

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

KNN ベクトルクエリ機能は招待プレビュー段階にあり、デフォルトでは無効になっています。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 の値が大きいほど、再現率、クエリレイテンシ、およびコストが高くなります。

  • top_k パラメーターの値が SearchQuery の limit パラメーターの値より小さい場合、サーバーは自動的に limit パラメーターの値を 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)

関連情報