Schema 与 Collection(Milvus 风格)
基础的 PistaDB API 存储 (id, label, vector) 三元组,在元数据能塞进 256 字节 label 时已经足够。当你需要在每条记录上附带多个类型化字段(章节、键、语言、行号、token 数等)时,Collection 层提供与 Milvus 兼容的 schema API。
你会得到什么
FieldSchema/CollectionSchema/DataType——声明INT64、VARCHAR、FLOAT、DOUBLE、BOOL、JSON、FLOAT_VECTOR字段,is_primary/auto_id/max_length/dim语义与pymilvus逐行对齐。Collection.insert(rows)——接收以字段名为 key 的 dict 列表;校验类型与长度;auto_id=True时自动生成 id。Collection.search(query, k, output_fields=…)——返回的 hit 同时携带被投影的标量字段。- JSON sidecar(
<path>.meta.json)——向量保留在.pst文件中;标量字段写入同名 JSON 文件,采用稳定的线协议格式,任意语言创建的 collection 都可以在其他语言中干净打开。
Python 示例
python
import numpy as np
from pistadb import FieldSchema, DataType, create_collection, Metric, Index
fields = [
FieldSchema("lc_id", DataType.INT64, is_primary=True, auto_id=True),
FieldSchema("lc_section", DataType.VARCHAR, max_length=100),
FieldSchema("lc_key", DataType.VARCHAR, max_length=200),
FieldSchema("lc_lang", DataType.VARCHAR, max_length=10),
FieldSchema("lc_lineno", DataType.INT64),
FieldSchema("lc_tokens", DataType.INT64),
FieldSchema("lc_vector", DataType.FLOAT_VECTOR, dim=1536),
]
coll = create_collection(
"common_text", fields, "Common text search",
metric=Metric.COSINE, index=Index.HNSW, base_dir="./db",
)
ids = coll.insert([
{"lc_section": "common", "lc_key": "btn_ok",
"lc_lang": "en", "lc_lineno": 12, "lc_tokens": 3,
"lc_vector": np.random.rand(1536).astype("float32")},
])
hits = coll.search(query, limit=10, output_fields=["lc_key", "lc_lang"])[0]
for h in hits:
print(h.id, h.distance, h["lc_key"], h["lc_lang"])
coll.flush()
coll.close()完整可运行的 Milvus create_database() 移植版本见 examples/example_schema.py。
Schema 规则
- 有且仅有一个
is_primary字段——必须为INT64。 - 有且仅有一个
FLOAT_VECTOR字段——必须有正的dim。 - 唯一的字段名。
校验在构造期完成。Python、Go、Rust、C#、C++、Java、Kotlin、Swift、WASM 中的约束完全一致。
同一套 API,所有语言
Go、Rust、C#、C++、Java、Kotlin、Swift、WASM 都暴露相同的 FieldSchema / Collection 表面。完整的多语言代码片段见语言绑定。
