向量检索

KnnVectorQuery使用数值向量进行近似最近邻查询,可以在大规模数据集中找到最相似的数据项。

目前向量检索功能处于邀测中,默认关闭。如果需要使用该功能,请提交工单进行申请或者加入钉钉群36165029092(表格存储技术交流群-3)进行咨询

前提条件

注意事项

  • 请确保已安装最新版本的表格存储Go SDK。具体操作,请参见安装表格存储Go SDK

  • 向量字段类型的个数、维度等存在限制。更多信息,请参见多元索引限制

  • 由于多元索引服务端是多分区的,多元索引服务端的每个分区均会返回自身最邻近的TopK个值并在协调节点进行汇总,因此如果要使用Token翻页获取所有数据,则获取到的总行数与多元索引服务端的分区数有关。

参数

参数

是否必选

说明

FieldName

向量字段名称。

TopK

查询最邻近的topK个值。关于最大值的说明请参见多元索引限制

重要
  • K值越大,召回率越好,但是查询延迟和费用越高。

  • TopK的值小于SearchQueryLimit的值时,服务端会自动把TopK的值放大到Limit的值。

Float32QueryVector

要查询相似度的向量。

Filter

查询过滤器,支持组合使用任意的非向量检索的查询条件。

示例

以下示例用于查询表中与指定向量最邻近的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))
        }  
    }
}

相关文档