本文介紹如何通過Java SDK在Collection中進行相似性檢索。
前提條件
已建立Cluster:建立Cluster。
已獲得API-KEY:API-KEY管理。
已安裝最新版SDK:安裝DashVector SDK。
介面定義
// class DashVectorCollection
// 同步介面
public Response<List<Doc>> query(QueryDocRequest queryDocRequest);
// 非同步介面
public ListenableFuture<Response<List<Doc>>> queryAsync(QueryDocRequest queryDocRequest);使用樣本
需要使用您的api-key替換樣本中的YOUR_API_KEY、您的Cluster Endpoint替換樣本中的YOUR_CLUSTER_ENDPOINT,代碼才能正常運行。
本樣本需要參考建立Collection-使用樣本提前建立好名稱為
quickstart的Collection,並參考插入Doc提前插入部分資料。
根據向量進行相似性檢索
import com.aliyun.dashvector.DashVectorClient;
import com.aliyun.dashvector.DashVectorCollection;
import com.aliyun.dashvector.common.DashVectorException;
import com.aliyun.dashvector.models.Doc;
import com.aliyun.dashvector.models.Vector;
import com.aliyun.dashvector.models.requests.QueryDocRequest;
import com.aliyun.dashvector.models.responses.Response;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws DashVectorException {
DashVectorClient client = new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT");
DashVectorCollection collection = client.get("quickstart");
// 構建Vector
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 構建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector)
.topk(100)
.includeVector(true)
.build();
// 進行Doc檢索
Response<List<Doc>> response = collection.query(request);
// 判斷請求是否成功
// assert response.isSuccess()
System.out.println(response);
// example output:
// {
// "code":0,
// "message":"Success",
// "requestId":"b26ce0b8-0caf-4836-8136-df889d79ae91",
// "output":[
// {
// "id":"1",
// "vector":{
// "value":[
// 0.10000000149011612,
// 0.20000000298023224,
// 0.30000001192092896,
// 0.4000000059604645
// ]
// },
// "fields":{
// "name":"zhangsan",
// "age":20,
// "weight":100.0,
// "anykey1":"String",
// "anykey2":1,
// "anykey3":true,
// "anykey4":3.1415926
// },
// "score":1.1920929E-7
// }
// ]
// }
}
}
根據主鍵(對應的向量)進行相似性檢索
// 構建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.id("1")
.topk(100)
.outputFields(Arrays.asList("name", "age")) // 僅返回name、age這2個Field
.includeVector(true)
.build();
// 根據主鍵(對應的向量)進行相似性檢索
Response<List<Doc>> response = collection.query(request);
// 判斷檢索是否成功
assert response.isSuccess()帶過濾條件的相似性檢索
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 構建QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector) // 向量檢索,也可設定主鍵檢索
.topk(100)
.filter("age > 18") // 條件過濾,僅對age > 18的Doc進行相似性檢索
.outputFields(Arrays.asList("name", "age")) // 僅返回name、age這2個Field
.includeVector(true)
.build();
// 根據向量或者主鍵進行相似性檢索 + 條件過濾
Response<List<Doc>> response = collection.query(request);
// 判斷檢索是否成功
assert response.isSuccess()帶有Sparse Vector的向量檢索
Sparse Vector(稀疏向量)可用於關鍵詞權重表示,實現帶關鍵詞感知能力的向量檢索。
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 構建帶有Sparse Vector的QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.vector(vector) // 向量檢索
.sparseVector(
new Map<Integer, Float>() {
{
put(1, 0.4f);
put(10000, 0.6f);
put(222222, 0.8f);
}
}) // 稀疏向量
.build();
// 根據向量進行相似性檢索 + 稀疏向量
Response<List<Doc>> response = collection.query(request);
// 判斷檢索是否成功
assert response.isSuccess()通過過濾條件進行匹配查詢
// 構建只攜帶過濾條件,不包含主鍵或向量的QueryDocRequest
QueryDocRequest request = QueryDocRequest.builder()
.topk(100)
.filter("age > 18") // 條件過濾,僅對age > 18的Doc進行相似性檢索
.outputFields(Arrays.asList("name", "age")) // 僅返回name、age這2個Field
.includeVector(true)
.build();
// 支援向量和主鍵都不傳入,那麼只進行條件過濾
Response<List<Doc>> response = collection.query(request);
// 判斷檢索是否成功
assert response.isSuccess()入參描述
可通過QueryDocRequestBuilder構造QueryDocRequest對象,其可用方法如下表所示:
vector和id兩個入參需要二選一使用,如都不傳入,則僅完成條件過濾。
方法 | 必填 | 預設值 | 描述 |
vector(Vector vector) | 否 | - | 向量資料 |
sparseVector(Map(Integer, Float)) | 否 | - | 稀疏向量 |
id(String id) | 否 | - | 主鍵,表示根據主鍵對應的向量進行相似性檢索 |
topk(int topk) | 否 | 10 | 返回topk相似性結果 |
filter(String filter) | 否 | - | 過濾條件,需滿足SQL where子句規範,詳見 |
includeVector(bool includeVector) | 否 | false | 是否返迴向量資料 |
partition(String partition) | 否 | default | 分區名稱 |
outputFields(List<String> outputFields) | 否 | - | 返迴文檔欄位列表,預設返回所有文檔欄位 |
outputField(String field) | 否 | - | |
build() | - | - | 構造 |
出參描述
返回結果為Response<List<Doc>>對象,Response<List<Doc>>對象中可擷取本次操作結果資訊,如下表所示。
方法 | 傳回型別 | 描述 | 樣本 |
getCode() | int | 傳回值,參考返回狀態代碼說明 | 0 |
getMessage() | String | 返回訊息 | success |
getRequestId() | String | 請求唯一id | 19215409-ea66-4db9-8764-26ce2eb5bb99 |
getOutput() | List<Doc> | 返回相似性檢索結果, Doc 參見Doc | |
isSuccess() | Boolean | 判斷請求是否成功 | true |