一、适用场景
某些业务场景下,业务数据的增长很快,并且业务数据的热度随着时间推移会有明显的降低,可以使用 TTL 将热度降低的数据在特定的过期时间时自动清理。例如:在电子商务平台中,用户搜索和浏览行为产生的向量数据,如点击流和用户偏好向量,通常具有很高的时效性。这些数据在短期内对于个性化推荐至关重要,但随着时间的推移,其相关性会迅速降低。在向量数据库集合中,设置TTL,便会自动删除过时的用户行为数据,确保推荐系统能够基于最新的用户互动提供实时、相关的推荐,从而提升用户体验和业务效率。
二、SDK demo
| SDK | Demo | SDK 获取方式 |
| Python SDK | ttl.py | Python SDK 准备 |
| Java SDK | VectorDBExample | Java SDK 准备 |
| Go SDK | ttl_demo | Go SDK 准备 |
三、使用示例
如下以 Java SDK 为例,给出使用 TTL 的关键步骤。
1. 创建集合时,指定 TTL 字段 expired_at,并将 TTL 字段 expired_at 设置 FIlter 索引。
// 初始化 Colleciton 参数CreateCollectionParam collectionParam = CreateCollectionParam.newBuilder() .withName("book-vector") .withShardNum(1) .withReplicaNum(1) .withDescription("this is a java sdk test") .addField(new FilterIndex("id", FieldType.String, IndexType.PRIMARY_KEY)) .addField(new VectorIndex("vector", 3, IndexType.HNSW, MetricType.COSINE, new HNSWParams(16, 200))) .addField(new FilterIndex("expired_at", FieldType.Uint64, IndexType.FILTER)) .withTtlConfig(TTLConfig.newBuilder().WithEnable(true).WithTimeField("expired_at").build()) .build();Collection collection = db.createCollection(collectionParam);
2. 插入向量数据时,指定 TTL 字段 expired_at 过期时间。
注意:说明:
注意:数据库插入数据,过期时间允许有1个小时的误差。
List<Document> documentList = new ArrayList<>(Arrays.asList( Document.newBuilder() .withId("0001") .withVector(Arrays.asList(0.2123, 0.21, 0.213)) .addDocField(new DocField("bookName", "西游记")) .addDocField(new DocField("author", "吴承恩")) // 设置数据过期时间为当前时间 24 小时之后 .addDocField(new DocField("expired_at", System.currentTimeMillis()/1000 + 24*60*60)) .build(), Document.newBuilder() .withId("0002") .withVector(Arrays.asList(0.2123, 0.25, 0.213)) .addDocField(new DocField("bookName", "三国演义")) .addDocField(new DocField("author", "罗贯中")) .build()));System.out.println("———————- upsert ———————-");InsertParam insertParam = InsertParam.newBuilder().withDocuments(documentList).build(); AffectRes affectRes = client.upsert("db-test", "book-vector", insertParam);System.out.println(JsonUtils.toJsonString(affectRes));