多元索引向量检索

向量检索(KnnVectorQuery)使用数值向量进行近似最近邻查询,可以在大规模数据集中找到最相似的数据项。向量检索功能适用于推荐系统、图像与视频检索、自然语言处理与语义搜索等场景。

说明

关于向量检索的更多信息,请参见向量检索介绍与使用

注意事项

  • 要使用向量检索,向量字段在数据表中对应列的数据类型必须为字符串类型。创建多元索引时,该列的数据类型需要配置为向量类型字段,并指定向量维度、向量数据类型和向量之间的距离度量算法。

  • 如果要在 SQL 查询时使用向量检索,则需要为数据表创建多元索引映射关系。关于如何创建多元索引映射关系,请参见创建多元索引的映射关系

数据类型映射

表数据类型

多元索引数据类型

SQL 数据类型

字符串

向量类型,并指定向量维度、向量数据类型和向量之间的距离度量算法。

VARCHAR(主键)

MEDIUMTEXT(预定义列)

创建方法

CREATE TABLE 语句中,向量列和普通列的创建方法和语法相同,只需要正确书写向量列名和对应的数据类型即可。在多元索引映射关系中,向量列的字段类型推荐定义成 MEDIUMTEXT 类型。

创建包含向量类型列的多元索引映射关系,SQL 示例如下:

CREATE TABLE `test_table__test_table_index`(
    `col_vector` MEDIUMTEXT
) 
ENGINE='searchindex'
ENGINE_ATTRIBUTE='{"index_name":"test_table_index", "table_name":"test_table"}';

向量检索

VECTOR_QUERY_FLOAT32

VECTOR_QUERY_FLOAT32 函数用于使用数值向量进行近似最近邻查询。

  • SQL 表达式

    VECTOR_QUERY_FLOAT32(fieldName, float32QueryVector,topk, filter)
  • 参数说明

    参数

    类型

    是否必选

    说明

    fieldName

    string

    要匹配的列。向量检索必须应用于多元索引向量类型字段。

    float32QueryVector

    string

    要查询相似度的向量。

    重要

    向量维度需要保证和多元索引中向量类型字段的维度一致。

    topK

    int

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

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

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

    filter

    string

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

  • 示例

    以下示例用于查询 exampletable 表中 col_vector 列与[1.5, -1.5, 2.5, -2.5]最相似的 10 个值。

    SELECT * FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, "[1.5, -1.5, 2.5, -2.5]", 10) limit 10;

SCORE()

SCORE() 函数用于获取查询结果的相关性分数,分数越大代表越相似。

  • SQL 表达式

    SCORE()
  • 示例

    以下示例用于查询 exampletable 表中 col_vector 列与[1.5, -1.5, 2.5, -2.5]最相似的 10 个值, 并展示查询结果的相关性分数。

    SELECT *,SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, "[1.5, -1.5, 2.5, -2.5]", 10) limit 10;

与其他查询组合使用示例

向量检索可以和其他条件自由组合使用,不同的组合使用方式会有不同的效果,以下对两种常见的使用方式进行说明。此处以一个 Filter 命中数据量较少的场景为例进行介绍。

假设表中有 1 亿张图片,其中用户“a”总计有 5 万张图片,但是在 2024 年仅有 50 张图片,用户“a”希望以图搜图的方式找到 2024 年最相似的 10 张图片。

  • 以下示例首先会通过 filter 筛选出用户“a”在 2024 年的所有 50 张图片,然后再从 50 张图片中找到最相似的 10 张图片返回给用户,并展示出每一张图片与目标图片的相关性分数。

    SELECT *,SCORE() FROM exampletable WHERE VECTOR_QUERY_FLOAT32(col_vector, "[1.5, -1.5, 2.5, -2.5]", 100, user="a" and year_num=2024) limit 10;
  • 以下示例会先返回表中 1 亿张图片中最相似的前 TopK=500 张图片,然后再按照顺序找出用户“a”在 2024 年的 10 张图片,并展示出每一张图片与目标图片的相关性分数。但是由于所有图片的 TopK=500 张图片中不一定包含用户“a”2024 年所有的 50 张图片,因此该查询方式不一定能找到 2024 年的 10 张图片,甚至找不到任何数据。

    SELECT *,SCORE() FROM exampletable WHERE user="a" and year_num=2024 and VECTOR_QUERY_FLOAT32(col_vector, "[1.5, -1.5, 2.5, -2.5]", 500) limit 10;

使用示例

假设数据表名称为 vector_query_table,该表中有主键列 pk(字符串类型)和两个属性列 col_vector(字符串类型)、col_keyword(字符串类型)。

如果要在 SQL 查询时使用向量检索,则需要为数据表创建多元索引并创建多元索引的映射关系,然后通过 SQL 语句使用向量检索。具体步骤如下:

  1. 创建多元索引并完成对向量字段的配置。具体操作,请参见通过控制台使用多元索引通过 SDK 使用多元索引

    说明

    如果要使用的多元索引中未配置向量字段,您可以通过修改多元索引的 schema 来配置向量字段。具体操作,请参见动态修改 schema

    • 使用控制台创建多元索引的配置如下图所示。

      多元索引名称为 vector_query_table_index,包括 col_vector(向量类型)和 col_keyword(String 类型)列。其中向量字段所在列为 col_vector

      image

    • 多元索引 Schema 如下图所示。

      image

  2. 创建多元索引映射关系。具体操作,请参见通过控制台使用 SQL 查询或者通过 SDK 使用 SQL 查询

    1. 多元索引映射关系名称为 vector_query_table__vector_query_table_index,该映射关系向量字段所在列 col_vector 对应的 SQL 数据类型为 MEDIUMTEXT。更多信息,请参见创建多元索引的映射关系

      SQL 示例如下:

      CREATE TABLE `vector_query_table__vector_query_table_index`(
          `col_vector` MEDIUMTEXT,
          `col_keyword` MEDIUMTEXT
      )
      ENGINE='searchindex',
      ENGINE_ATTRIBUTE='{"index_name":"vector_query_table_index","table_name":"vector_query_table"}';
    2. (可选)创建多元索引映射关系后,请根据需要执行如下操作。

      查询表的描述信息

      执行如下语句查询表的描述信息。

      DESCRIBE vector_query_table__vector_query_table_index;

      返回结果如下图所示。

      image

      获取表中数据

      执行如下语句获取表中数据。

      SELECT * FROM vector_query_table__vector_query_table_index;

      返回结果如下图所示。假设多元索引映射关系 vector_query_table__vector_query_table_index 有 10 条数据。

      image

  3. 使用向量检索查询数据。更多信息,请参见查询数据

    以下示例用于查询 col_vector 列与[1.5, 2.0, 2.5, 1.7]最相似的 5 个值, 并展示查询结果的相关性分数。

    SELECT *,SCORE() FROM vector_query_table__vector_query_table_index WHERE VECTOR_QUERY_FLOAT32(col_vector, "[1.5, 2.0, 2.5, 1.7]", 5) limit 5;

    返回结果如下图所示。

    image

使用限制

  • VECTOR_QUERY_FLOAT32 函数只能在多元索引映射关系上使用。

  • 使用 VECTOR_QUERY_FLOAT32 函数时,必须使用 limit,不能使用 Having 子句。

  • VECTOR_QUERY_FLOAT32 函数只能作为 SELECT 语句的 WHERE 子句,不能作为 SELECT 语句的列表达式,不能用于聚合函数计算,不能进行分组和排序。

  • SCORE() 函数只能配合 VECTOR_QUERY_FLOAT32 函数一起使用,不能单独使用。

  • SCORE() 函数只能作为 SELECT 语句的列表表达式,不能作为 SELECT 语句的 WHERE 子句,不能用于聚合函数计算,不能直接用于排序语句。