全部產品
Search
文件中心

Tablestore:多元索引向量檢索

更新時間:Oct 24, 2024

向量檢索(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 子句,不能用於彙總函式計算,不能直接用於排序語句。