向量檢索
KnnVectorQuery使用數(shù)值向量進(jìn)行近似最近鄰查詢,可以在大規(guī)模數(shù)據(jù)集中找到最相似的數(shù)據(jù)項(xiàng)。
前提條件
已初始化OTSClient。具體操作,請(qǐng)參見初始化OTSClient。
已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。具體操作,請(qǐng)參見創(chuàng)建數(shù)據(jù)表和寫入數(shù)據(jù)。
已在數(shù)據(jù)表上創(chuàng)建多元索引并配置向量字段。具體操作,請(qǐng)參見創(chuàng)建多元索引。
注意事項(xiàng)
表格存儲(chǔ)Java SDK從5.17.0版本開始支持向量檢索功能,請(qǐng)確保已安裝正確的表格存儲(chǔ)Java SDK版本。
說明關(guān)于Java SDK歷史迭代版本的更多信息,請(qǐng)參見Java SDK歷史迭代版本。
向量字段類型的個(gè)數(shù)、維度等存在限制。更多信息,請(qǐng)參見多元索引限制。
由于多元索引服務(wù)端是多分區(qū)的,多元索引服務(wù)端的每個(gè)分區(qū)均會(huì)返回自身最鄰近的TopK個(gè)值并在協(xié)調(diào)節(jié)點(diǎn)進(jìn)行匯總,因此如果要使用Token翻頁獲取所有數(shù)據(jù),則獲取到的總行數(shù)與多元索引服務(wù)端的分區(qū)數(shù)有關(guān)。
參數(shù)
參數(shù) | 是否必選 | 說明 |
fieldName | 是 | 向量字段名稱。 |
topK | 是 | 查詢最鄰近的topK個(gè)值。關(guān)于最大值的說明請(qǐng)參見多元索引限制。 重要
|
float32QueryVector | 是 | 要查詢相似度的向量。 |
filter | 否 | 查詢過濾器,支持組合使用任意的非向量檢索的查詢條件。 |
示例
以下示例用于查詢表中與指定向量最鄰近的10個(gè)向量數(shù)據(jù),并且最鄰近的向量需要滿足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);
// 按照分?jǐn)?shù)排序。
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()) {
// 打印分?jǐn)?shù)。
System.out.println(hit.getScore());
// 打印數(shù)據(jù)。
System.out.println(hit.getRow());
}
}
相關(guān)文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、前綴查詢、范圍查詢、通配符查詢、地理位置查詢、向量檢索、多條件組合查詢、嵌套類型查詢和列存在性查詢,您可以選擇合適的查詢類型進(jìn)行多維度數(shù)據(jù)查詢。
如果要對(duì)結(jié)果集進(jìn)行排序或者翻頁,您可以使用排序和翻頁功能來實(shí)現(xiàn)。具體操作,請(qǐng)參見排序和翻頁。
如果要按照某一列對(duì)結(jié)果集做折疊,使對(duì)應(yīng)類型的數(shù)據(jù)在結(jié)果展示中只出現(xiàn)一次,您可以使用折疊(去重)功能來實(shí)現(xiàn)。具體操作,請(qǐng)參見折疊(去重)。
如果要進(jìn)行數(shù)據(jù)分析,例如求最值、求和、統(tǒng)計(jì)行數(shù)等,您可以使用Search接口的統(tǒng)計(jì)聚合功能或者SQL查詢來實(shí)現(xiàn)。具體操作,請(qǐng)參見統(tǒng)計(jì)聚合和SQL查詢。
如果要快速導(dǎo)出數(shù)據(jù),而不關(guān)心整個(gè)結(jié)果集的順序時(shí),您可以使用ParallelScan接口和ComputeSplits接口實(shí)現(xiàn)多并發(fā)導(dǎo)出數(shù)據(jù)。具體操作,請(qǐng)參見并發(fā)導(dǎo)出數(shù)據(jù)。