全部產品
Search
文件中心

:向量檢索

更新時間:Jul 03, 2024

KnnVectorQuery使用數值向量進行近似最近鄰查詢,可以在大規模資料集中找到最相似的資料項目。

目前向量檢索功能處於邀測中,預設關閉。如果需要使用該功能,請提交工單進行申請。

前提條件

注意事項

  • Table StoreJava SDK從5.17.0版本開始支援向量檢索功能,請確保已安裝正確的Table StoreJava 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());
    }
}

相關文檔