更新Doc
本文介紹如何通過Java SDK更新Collection中已存在的Doc。
若更新Doc時指定id不存在,則本次更新Doc操作無效
如只更新部分屬性fields,其他未更新屬性fields默認(rèn)被置為
null
Java SDK 1.0.10版本后,更新Doc時vector變?yōu)榉潜靥铐?xiàng)
前提條件
已創(chuàng)建Cluster:創(chuàng)建Cluster。
已獲得API-KEY:API-KEY管理。
已安裝最新版SDK:安裝DashVector SDK。
接口定義
// class DashVectorCollection
// 同步接口
public Response<List<DocOpResult>> update(UpdateDocRequest updateDocRequest);
// 異步接口
public ListenableFuture<Response<List<DocOpResult>>> updateAsync(UpdateDocRequest updateDocRequest);
使用示例
需要使用您的api-key替換示例中的YOUR_API_KEY、您的Cluster Endpoint替換示例中的YOUR_CLUSTER_ENDPOINT,代碼才能正常運(yùn)行。
本示例需要參考新建Collection-使用示例提前創(chuàng)建好名稱為
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.UpdateDocRequest;
import com.aliyun.dashvector.models.responses.Response;
import java.util.*;
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");
// 構(gòu)建Vector
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 構(gòu)建Doc
Doc doc = Doc.builder().id("1").vector(vector).build();
// 更新Doc
Response<List<DocOpResult>> response = collection.update(UpdateDocRequest.builder().doc(doc).build());
// 判斷更新Doc是否成功
// assert response.isSuccess()
}
}
更新帶有Fields的Doc
// 構(gòu)建Vector
Vector vector = Vector.builder().value(Arrays.asList(0.2f, 0.2f, 0.3f, 0.4f)).build();
// 更新單條數(shù)據(jù),并設(shè)置Fields Value
Doc doc = Doc.builder()
.id("2")
.vector(vector)
// 設(shè)置創(chuàng)建Collection時預(yù)定義的Fields Value
.field("name", "zhangshan")
.field("age", 20)
.field("weight", 100f)
// 設(shè)置Schema-Free的Field & Value
.field("anykey1", "String")
.field("anykey2", 1)
.field("anykey3", true)
.field("anykey4", 3.1415926f)
.build();
// 更新Doc
Response<List<DocOpResult>> response = collection.update(UpdateDocRequest.builder().doc(doc).build());
// 判斷更新Doc是否成功
assert response.isSuccess()
批量更新Doc
// 通過UpdateDocRequest對象,批量更新10條Doc
List<Doc> docs = new ArrayList<>();
for (int i = 0; i < 10; i++) {
docs.add(
Doc.builder()
.id(Integer.toString(i+3))
.vector(Vector.builder().value(Collections.nCopies(4, (float) i+3)).build())
.build()
);
}
UpdateDocRequest request = UpdateDocRequest.builder().docs(docs).build();
Response<List<DocOpResult>> response = collection.update(request);
// 判斷批量更新Doc是否成功
assert response.isSuccess();
異步更新Doc
// 異步批量更新10條數(shù)據(jù)
List<Doc> docs = new ArrayList<>();
for (int i = 0; i < 10; i++) {
docs.add(
Doc.builder()
.id(Integer.toString(i+13))
.vector(Vector.builder().value(Collections.nCopies(4, (float) i+13)).build())
.build()
);
}
UpdateDocRequest request = UpdateDocRequest.builder().docs(docs).build();
ListenableFuture<Response<List<DocOpResult>>> response = collection.updateAsync(request);
// 等待并獲取異步update結(jié)果
Response<List<DocOpResult>> ret = response.get();
更新帶有Sparse Vector的Doc
Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
// 構(gòu)建帶有Sparse Vector的Doc
Doc doc = Doc.builder()
.id("28")
.sparseVector(
new Map<Integer, Float>() {
{
put(1, 0.4f);
put(10000, 0.6f);
put(222222, 0.8f);
}
})
.vector(vector)
.build();
// 更新Doc
Response<List<DocOpResult>> response = collection.update(UpdateDocRequest.builder().doc(doc).build());
入?yún)⒚枋?/h2>
使用UpdateDocRequestBuilder
構(gòu)造UpdateDocRequest
對象,其可用方法如下:
方法 | 必填 | 默認(rèn)值 | 描述 |
docs(List<Doc> docs) | 是 | - | 設(shè)置Doc列表 |
doc(Doc doc) | 追加Doc至Doc列表,可多次調(diào)用 | ||
partition(String partition) | 否 | default | 分區(qū)名稱 |
build() | - | - | 構(gòu)造 |
使用DocBuilder
構(gòu)造Doc
對象,其可用方法如下:
方法 | 必填 | 默認(rèn)值 | 描述 |
id(String id) | 是 | - | 主鍵 |
vector(Vector vector) | 否 | - | 向量數(shù)據(jù) |
sparseVector(Map(Integer, Float)) | 否 | - | 稀疏向量 |
fields(Map<String, Object>) | 否 | - | 設(shè)置Fields |
field(String key, Object value) | 追加Field至Fields,可多次調(diào)用 | ||
build() | - | - | 構(gòu)造 |
Doc對象的fields參數(shù),可自由設(shè)置“任意”的KeyValue數(shù)據(jù),Key必須為
String
類型,Value必須為String, Integer, Boolean or Float
。當(dāng)Key在創(chuàng)建Collection時預(yù)先定義過,則Value的類型必須為預(yù)定義時的類型
當(dāng)Key未在創(chuàng)建Collection時預(yù)先定義過,則Value的類型可為
String, Integer, Boolean or Float
是否預(yù)先定義Fields,可參考Schema Free。
出參描述
返回結(jié)果為Response<List<DocOpResult>>
對象,Response<List<DocOpResult>>
對象中可獲取本次操作結(jié)果信息,如下表所示。
方法 | 類型 | 描述 | 示例 |
getCode() | int | 返回值,參考返回狀態(tài)碼說明 | 0 |
getMessage() | String | 返回消息 | success |
getRequestId() | String | 請求唯一id | 19215409-ea66-4db9-8764-26ce2eb5bb99 |
getOutput() | List<DocOpResult> | 返回更新Doc的結(jié)果 | |
getUsage() | 對Serverless實(shí)例(按量付費(fèi))集合的Doc更新請求,成功后返回實(shí)際消耗的寫請求單元數(shù) | ||
isSuccess() | Boolean | 判斷請求是否成功 | true |