Skip to content

写入与更新

Upsert(插入或覆盖)

同一 id 再次写入会覆盖向量与 payload(具体字段合并行为以 API 为准,通常整段替换)。

Python

python
from qdrant_client.models import PointStruct

client.upsert(
    collection_name="demo_text",
    points=[
        PointStruct(
            id=1,
            vector=[0.1] * 384,  # 实际应替换为真实 Embedding
            payload={"title": "第一篇", "lang": "zh"},
        ),
        PointStruct(
            id=2,
            vector=[0.2] * 384,
            payload={"title": "第二篇", "lang": "zh"},
        ),
    ],
)

Java(与集合维度一致;此处演示 4 维,384 维请用模型输出的 float[] 配合 VectorsFactory.vectors 的重载)

java
import static io.qdrant.client.PointIdFactory.id;
import static io.qdrant.client.ValueFactory.value;
import static io.qdrant.client.VectorsFactory.vectors;

import io.qdrant.client.grpc.Points.PointStruct;
import java.util.List;
import java.util.Map;

// 若集合为 384 维:float[] emb = model.embed("..."); 再 vectors(emb)(以客户端 API 为准)
PointStruct p1 = PointStruct.newBuilder()
    .setId(id(1))
    .setVectors(vectors(0.1f, 0.1f, 0.1f, 0.1f))
    .putAllPayload(Map.of(
        "title", value("第一篇"),
        "lang", value("zh")))
    .build();

client.upsertAsync("demo_text", List.of(p1)).get();

高维向量请查阅 io.qdrant:clientVectorsFactoryfloat[] / List<Float> 的支持;语义与 Python 一致。

只更新 Payload

若支持 set payload 接口,可在不重复传向量的情况下更新元数据(以当前 API 为准)。大流量场景可减少带宽。

批量大小

单次 upsert 点数过多可能超时或占内存;可每批 100~500 点(视维度与机器调整),循环提交。

下一节:删除与清空