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

Tablestore:KNN ベクトルクエリ

最終更新日:Dec 28, 2024

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

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

前提条件

使用上の注意

  • 最新バージョンの Tablestore SDK for Go がインストールされていることを確認してください。詳細については、Tablestore SDK for Go のインストールを参照してください。

  • ベクトルフィールドの数とベクトルフィールドの次元数には制限があります。詳細については、検索インデックスの制限を参照してください。

  • 検索インデックスサーバーには複数のパーティションがあります。検索インデックスサーバーの各パーティションは、クエリ対象のベクトルに最も近い上位 K 個の近傍を返します。パーティションによって返された上位 K 個の近傍は、クライアントノードで集計されます。トークンを使用してすべてのデータをページごとにクエリする場合、レスポンス内の行の総数は、検索インデックスサーバーのパーティションの数に関連しています。

パラメーター

パラメーター

必須

説明

FieldName

はい

ベクトルフィールドの名前。

TopK

はい

クエリ対象のベクトルと最も類似性の高い上位 K 個のクエリ結果。TopK パラメーターの最大値については、検索インデックスの制限を参照してください。

重要
  • K の値が大きいほど、再現率、クエリレイテンシ、およびコストが高くなります。

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

Float32QueryVector

はい

類似性をクエリするベクトル。

Filter

いいえ

フィルター。KNN ベクトルクエリ条件ではないクエリ条件の組み合わせを使用できます。

次のサンプルコードは、指定されたベクトルと最も類似性の高い上位 10 個のベクトルをテーブル内でクエリする方法の例を示しています。この例では、上位 10 個のベクトルは、col_keyword 列の値が hangzhou であるというクエリ条件を満たす必要があります。

func query(client *tablestore.TableStoreClient) {
    searchQuery := search.NewSearchQuery()
    searchQuery.Query = &search.KnnVectorQuery{
        FieldName:          "col_vector",
        TopK:               proto.Int32(10),
        Float32QueryVector: []float32{-1.4, 1, 1, 1.2},
        Filter: &search.BoolQuery{
            ShouldQueries: []search.Query{
                &search.TermQuery{
                    FieldName: "col_keyword",
                    Term:      "hangzhou",
                },
            },
        },
    }
    searchQuery.Sort = &search.Sort{
        Sorters: []search.Sorter{
            search.NewScoreSort(), // クエリ結果をスコアに基づいてソートします。
        },
    }
    searchRequest := &tablestore.SearchRequest{
        SearchQuery: searchQuery,
        TableName:   "<TABLE_NAME>",
        IndexName:   "<SEARCH_INDEX_NAME>",
        ColumnsToGet: &tablestore.ColumnsToGet{Columns: []string{
            "col_keyword",
            "col_long",
        }},
    }

    if resp, err := client.Search(searchRequest); err != nil {
        fmt.Println("float32 vector query failed: ", err)
    } else {
        for _, hit := range resp.SearchHits {
            fmt.Println("score:", *hit.Score)
            jsonBody, err := json.Marshal(hit.Row)
            if err != nil {
                panic(err)
            }
            fmt.Println("row: ", string(jsonBody))
        }  
    }
}

関連情報