插入数据

最近更新时间:2024-09-29 15:47:41

我的收藏

接口定义

upsert() 接口用于给创建的 Collection 中插入 Document。如果 Collection 在创建时,已配置 Embedding 参数,则仅需要插入文本信息,Embedding 服务会自动将文本信息转换为向量数据,存入数据库。
public AffectRes upsert(InsertParam param)

使用示例

说明:
在插入数据时, Collection 中已经存在相同 ID 的 Document,则会删除源 Document 后插入新的 Document 数据。
如果 Collection 在创建时,配置 Embedding 参数,则插入文本,Embedding 服务会自动将文本信息转换为向量数据,存入数据库。
写入原始文本
写入向量数据+稀疏向量
如果您使用 Embedding 功能,在createCollection() 建表时,配置 Embedding 模型相关参数之后,便可以通过 upsert() 接口可直接传入原始文本。Embedding 模型会将原始文本转换为向量数据,并将转换后的向量数据以及原始文本一并存入数据库。具体信息,请参见 Embedding 介绍。如下示例,基于 createCollection() 创建的集合 book-emb,写入原始文本。
// link database
Database db = client.database("db-test");
// link collection
Collection collection = db.collection("book-emb");
// upsert
Document doc1 = Document.newBuilder()
.withId("0001")
.addDocField(new DocField("text", "话说天下大势,分久必合,合久必分。"))
.addDocField(new DocField("bookName", "三国演义"))
.addDocField(new DocField("author", "罗贯中"))
.addDocField(new DocField("page", 21))
.addDocField(new DocField("tags", Arrays.asList("曹操","诸葛亮","刘备")))
.build();
Document doc2 = Document.newBuilder()
.withId("0002")
.addDocField(new DocField("text",
                "正大光明,混沌未分天地乱,茫茫渺渺无人间。"))
.addDocField(new DocField("bookName", "西游记"))
.addDocField(new DocField("author", "吴承恩"))
.addDocField(new DocField("page", 22))
.addDocField(new DocField("tags", Arrays.asList("孙悟空","猪八戒","唐僧")))
.build();
Document doc3 = Document.newBuilder()
.withId("0003")
.addDocField(new DocField("text", "甄士隐梦幻识通灵,贾雨村风尘怀闺秀。"))
.addDocField(new DocField("bookName", "红楼梦")) .addDocField(new DocField("author", "曹雪芹")) .addDocField(new DocField("page", 23)) .addDocField(new DocField("tags", Arrays.asList("贾宝玉","林黛玉","王熙凤")))
.build();

InsertParam insertParam = InsertParam.newBuilder()
.addDocument(doc1)
.addDocument(doc2)
.addDocument(doc3)
.withBuildIndex(true)
.build();
AffectRes affectRes = collection.upsert(insertParam);
System.out.println("\\tres: " + affectRes);
如果您无需使用腾讯云向量数据库(Tencent Cloud VectorDB)的 Embedding 功能做向量化,则可以直接写入向量数据。
// link database
Database db = client.database("db-test");
// link collection
Collection collection = db.collection("book-vector");
// upsert
Document doc1 = Document.newBuilder()
.withId("0001")
.withVector(Arrays.asList(0.2123, 0.21, 0.213))
.withSparseVector(Arrays.asList(Pair.of(2l, 0.96f), Pair.of(5l, 0.53f),Pair.of(100l, 0.443f)))
.addDocField(new DocField("bookName", "西游记"))
.addDocField(new DocField("author", "吴承恩"))
.addDocField(new DocField("page", 21))
.addDocField(new DocField("tags", Arrays.asList("曹操","诸葛亮","刘备")))
.build();
Document doc2 = Document.newBuilder()
.withId("0002")
.withVector(Arrays.asList(0.2123, 0.22, 0.213))
.withSparseVector(Arrays.asList(Pair.of(2l, 0.97f), Pair.of(5l, 0.54f),Pair.of(100l, 0.444f)))
.addDocField(new DocField("bookName", "西游记"))
.addDocField(new DocField("author", "吴承恩"))
.addDocField(new DocField("page", 22))
.addDocField(new DocField("tags", Arrays.asList("孙悟空","猪八戒","唐僧")))
.build();
Document doc3 = Document.newBuilder()
.withId("0003")
.withVector(Arrays.asList(0.2123, 0.23, 0.213))
.withSparseVector(Arrays.asList(Pair.of(2l, 0.98f), Pair.of(5l, 0.55f),Pair.of(100l, 0.445f)))
.addDocField(new DocField("bookName", "红楼梦")) .addDocField(new DocField("author", "曹雪芹")) .addDocField(new DocField("page", 23)) .addDocField(new DocField("tags", Arrays.asList("贾宝玉","林黛玉","王熙凤")))
.build();

InsertParam insertParam = InsertParam.newBuilder()
.addDocument(doc1)
.addDocument(doc2)
.addDocument(doc3)
.withBuildIndex(true)
.build();
collection.upsert(insertParam);

请求参数

参数名称
参数含义
子参数
是否必选
配置方法
Document
指定要插入的 Document数据,是一个数组,支持单次插入一条或者多条 Document,最大可插入 1000条。
Id
Document 主键,长度限制为[1,128]。
Vector
表示文档的向量值,请务必使用32位浮点数存储向量数据。
说明:
如果业务无需使用腾讯云向量数据库(Tencent Cloud VectorDB)的 Embedding 功能做向量化,则配置该参数,写入向量数据,而无需配置 Embedding 参数 text (创建 Collection 时,Embedding 参数 field 对应指定的文本字段名,示例中为 text)。
DocField
text 字段为该参数为创建集合 时,Embedding 参数 field 对应指定的文本字段名。您可以自定义其他便于识别的字段名。
说明:
写入原始文本数据,系统会自动从该字段中提取原始文本信息,并将其转换为向量数据,并将原始文本以及转化后的向量数据一起存储在数据库中。
sparse_vector 为创建集合时自定义的稀疏向量的字段名。
其他标量字段,用于存储文档的其他信息。例如:bookName、author、page。
BuildIndex
指定是否需要更新索引
-
取值如下所示:
true:需更新索引。默认值是 true
false:不更新索引。
注意:
如果创建 Collection 选择的索引类型为 IVF 系列:
当第一次写入时,当前集合还没有向量索引,此时 BuildIndex 必须为 false。插入原始数据之后,需通过 rebuildIndex() 训练数据并重建索引。
当集合已经调用过 rebuildIndex() 创建索引后,集合已经存在向量索引,此时:
如果 BuildIndex = true,表示新写入的数据会加入到已有的 IVF 索引中,但不会更新索引结构,此时新写入的数据可以被检索到。
如果 BuildIndex = false,表示新写入的数据不会加入到已有的 IVF 索引中,此时新写入的数据无法被检索到。

出参描述

res: AffectRes{affectedCount=5, code=0, msg='operation success'}
参数名
参数含义
affectedCount
插入的文档数量。