帮助文档 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
帮助文档 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 表格存储
  4. 开发参考
  5. SDK参考
  6. Java SDK
  7. 多元索引
  8. 数据查询
  9. 向量检索

向量检索

  • 数据查询
  • 发布于 2025-04-22
  • 0 次阅读
文档编辑
文档编辑

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

前提条件

  • 已初始化OTSClient。具体操作,请参见初始化Tablestore Client。

  • 已创建数据表并写入数据。具体操作,请参见创建数据表和写入数据。

  • 已在数据表上创建多元索引并配置向量字段。具体操作,请参见创建多元索引。

注意事项

  • 表格存储Java SDK从5.17.0版本开始支持向量检索功能,请确保已安装正确的表格存储Java SDK版本。

    说明

    关于Java SDK历史迭代版本的更多信息,请参见Java SDK历史迭代版本。

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

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

参数

参数

是否必选

说明

fieldName

是

向量字段名称。

topK

是

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

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

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

float32QueryVector

是

要查询相似度的向量。

filter

否

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

示例

以下示例用于查询表中与指定向量最邻近的10个向量数据,并且最邻近的向量需要满足Col_Keyword列值等于"hangzhou"且Col_Long列值小于4的条件。

private static void knnVectorQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    KnnVectorQuery query = new KnnVectorQuery();
    query.setFieldName("Col_Vector");
    query.setTopK(10); // 返回最邻近的topK。
    query.setFloat32QueryVector(new float[]{0.1f, 0.2f, 0.3f, 0.4f});
    // 最邻近的向量需要满足Col_Keyword=hangzhou && Col_Long<4条件。
    query.setFilter(QueryBuilders.bool()
            .must(QueryBuilders.term("Col_Keyword", "hangzhou"))
            .must(QueryBuilders.range("Col_Long").lessThan(4))
    );
    searchQuery.setQuery(query);
    searchQuery.setLimit(10);
    // 按照分数排序。
    searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    columnsToGet.setColumns(Arrays.asList("Col_Keyword", "Col_Long"));
    searchRequest.setColumnsToGet(columnsToGet);
    // 访问Search接口。
    SearchResponse resp = client.search(searchRequest);
    for (SearchHit hit : resp.getSearchHits()) {
        // 打印分数。
        System.out.println(hit.getScore());
        // 打印数据。
        System.out.println(hit.getRow());
    }
}

常见问题

如何优化表格存储的向量检索效果

相关文档

  • 多元索引查询类型包括精确查询、多词精确查询、全匹配查询、匹配查询、短语匹配查询、前缀查询、范围查询、通配符查询、地理位置查询、向量检索、多条件组合查询、嵌套类型查询和列存在性查询,您可以选择合适的查询类型进行多维度数据查询。

    如果要对结果集进行排序或者翻页,您可以使用排序和翻页功能来实现。具体操作,请参见排序和翻页。

    如果要按照某一列对结果集做折叠,使对应类型的数据在结果展示中只出现一次,您可以使用折叠(去重)功能来实现。具体操作,请参见折叠(去重)。

  • 如果要进行数据分析,例如求最值、求和、统计行数等,您可以使用Search接口的统计聚合功能或者SQL查询来实现。具体操作,请参见统计聚合和SQL查询。

  • 如果要快速导出数据,而不关心整个结果集的顺序时,您可以使用ParallelScan接口和ComputeSplits接口实现多并发导出数据。具体操作,请参见并发导出数据。

相关文章

基础查询 2025-04-22 14:28

本文介绍表格存储Java SDK支持的多元索引基础查询类型。

全匹配查询 2025-04-22 14:28

全匹配查询(MatchAllQuery)可以匹配所有行,常用于查询表中数据总行数,或者随机返回几条数据。 前提

精确查询 2025-04-22 14:28

精确查询(TermQuery)采用完整精确匹配的方式查询表中的数据,类似于字符串匹配。对于Text类型字段,只要Text类型的字段值分词后有词条可以精确匹配查询关键词即可,查询关键词不会被分词。

多词精确查询 2025-04-22 14:28

多词精确查询(TermsQuery)类似于精确查询(TermQuery),但是TermsQuery可以指定多个查询关键词,查询匹配这些词的数据。多个查询关键词中只要有一个词能精确匹配,该行数据就会被返回,等价于SQL中的In。

前缀查询 2025-04-22 14:28

前缀查询(PrefixQuery)是通过指定前缀条件查询索引中的数据。本文介绍如何通过Java SDK使用前缀查询。 前提条件

后缀查询 2025-04-22 14:28

后缀查询(SuffixQuery)是通过指定后缀条件查询索引中的数据,例如通过手机尾号后4位查询快递。 前提条件

目录
Copyright © 2025 your company All Rights Reserved. Powered by 博智数字服务平台.
闽ICP备08105208号-1