向量检索

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

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

前提条件

注意事项

  • 表格存储Node.js SDK5.5.0版本开始支持向量检索功能,请确保已安装正确的表格存储Node.js SDK版本。

    说明

    关于Node.js SDK历史迭代版本的更多信息,请参见Node.js SDK历史迭代版本

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

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

参数

参数

是否必选

说明

fieldName

向量字段名称。

topK

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

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

  • topK的值小于SearchQuerylimit的值时,服务端会自动把topK的值放大到limit的值。

float32QueryVector

要查询相似度的向量。

filter

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

示例

以下示例用于查询表中与指定向量最邻近的10个向量数据,并且最邻近的向量需要满足col_keyword列值等于"0"且col_long列值在050之间的条件。

const tableName = "<TABLE_ANME>"
const indexName = "<SEARCH_INDEX_NAME>"

async function knnVectorQuery() {
    return new Promise(function (resolve, reject) {
        let params = {
            tableName: tableName,
            indexName: indexName,
            searchQuery: {
                offset: 0,
                limit: 10,
                query: {
                    queryType: TableStore.QueryType.KNN_VECTOR_QUERY,
                    query: {
                        fieldName: "col_vector",
                        topK: TableStore.Long.fromNumber(10),
                        float32QueryVector: [1.0, 1.1, 1.2, -1.3],
                        filter: {
                            queryType: TableStore.QueryType.BOOL_QUERY,
                            query: {
                                mustQueries: [
                                    {
                                        queryType: TableStore.QueryType.RANGE_QUERY,
                                        query: {
                                            fieldName: "col_long",
                                            rangeFrom: TableStore.Long.fromNumber(0),
                                            includeLower: true,
                                            rangeTo: TableStore.Long.fromNumber(50),
                                            includeUpper: true,
                                        }
                                    },
                                    {
                                        queryType: TableStore.QueryType.TERM_QUERY,
                                        query: {
                                            fieldName: "col_keyword",
                                            term: "0",
                                        }
                                    },
                                ],
                            }
                        },
                    },
                },
                sort: {
                    sorters: [
                        {
                            scoreSort: {
                                order: TableStore.SortOrder.SORT_ORDER_DESC  // 向量查询需要按照分数逆序排序
                            }
                        }
                    ],
                },
                getTotalCount: false,
            },
            columnToGet: {
                returnType: TableStore.ColumnReturnType.RETURN_SPECIFIED,
                returnNames: ["col_long", "col_keyword"]
            },
            timeoutMs: 10000,
        }
        client.search(params, function (err, data) {
            if (err) {
                console.log('search error:', err.toString());
                reject(err);
            } else {
                console.log('RequestId:', data.RequestId);
                for (let i = 0; i < data.searchHits.length; i++) {
                    let hit = data.searchHits[i]
                    console.log('Score:', hit.score, 'Row:', hit.row);
                }
                resolve(data)
            }
        });
    })
}
knnVectorQuery();

相关文档