Zvec Logo

创建 Collection

创建并打开 Collection

要在 Zvec 中创建一个新的空 Collection,需要定义以下内容:

  1. Schema — 数据的结构蓝图,定义标量字段和向量 Embedding。
  2. Collection 选项(可选)— 控制 Collection 打开时行为的运行时设置(如只读模式)。

定义完成后,调用 create_and_open() 在指定路径初始化新的 Collection,并返回一个可用于插入和查询的 Collection 对象。

如果指定路径已存在 Collection,create_and_open() 将抛出错误以防止意外覆盖。

创建并打开 Collection
import zvec

# 定义 Collection Schema
collection_schema = zvec.CollectionSchema(
    name="example_collection",
    fields=[
        zvec.FieldSchema(
            name="string_field_example",
            data_type=zvec.DataType.STRING,
            nullable=True,
            index_param=zvec.InvertIndexParam(enable_range_optimization=False),
        ),
    ],
    vectors=[
        zvec.VectorSchema(
            name="dense_vector_example",
            data_type=zvec.DataType.VECTOR_FP32,
            dimension=768,
            index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE),
        ),
    ],
)

# 创建并打开 Collection
collection = zvec.create_and_open(  
    path="/path/to/my/collection",
    schema=collection_schema,
    option=zvec.CollectionOption(read_only=False, enable_mmap=True),
)

实际场景示例:🛒 商品搜索

该 Schema 建模了一个多模态商品搜索系统,结合视觉、文本和结构化元数据实现丰富的检索:

🗂️ 标量字段:用于过滤和展示

  • category(字符串数组,已索引): 支持 category CONTAIN_ANY ("electronics", "headphones") 查询,查找属于 "electronics" 或 "headphones"(或两者)的商品。
  • price(整数,启用范围优化索引): 支持快速范围查询,如 price > 100
  • in_stock(布尔值,已索引): 按库存状态即时过滤(如"仅显示有货商品")。
  • image_urldescription 仅存储不建索引,因为它们仅用于展示。

📐 向量 Embedding:用于语义相关性

  • 两个稠密向量捕获语义信息:
    • image_vec:512 维商品图片 Embedding(如来自视觉模型)。
    • description_vec:768 维商品描述 Embedding(如来自语言模型),启用量化存储。
  • 一个稀疏向量 keywords_sparse 用于关键词匹配,支持稀疏-稠密混合搜索。
创建 Collection
import zvec

collection_schema = zvec.CollectionSchema(  
    name="product_search",
    fields=[  
        zvec.FieldSchema(
            name="image_url",
            data_type=zvec.DataType.STRING,  # 不用于过滤,不创建索引
            nullable=True,  # 可为空
        ),
        zvec.FieldSchema(
            name="description",
            data_type=zvec.DataType.STRING,  # 不用于过滤,不创建索引
        ),
        zvec.FieldSchema(
            name="category",
            data_type=zvec.DataType.ARRAY_STRING,
            # 倒排索引,用于数组成员查询
            index_param=zvec.InvertIndexParam(),
        ),
        zvec.FieldSchema(
            name="price",
            data_type=zvec.DataType.INT32,
            # 范围查询优化,如 price > 100
            index_param=zvec.InvertIndexParam(enable_range_optimization=True),
        ),
        zvec.FieldSchema(
            name="in_stock",
            data_type=zvec.DataType.BOOL,
            # 倒排索引,用于布尔查询
            index_param=zvec.InvertIndexParam(),
        ),
    ],
    vectors=[  
        # 商品图片的稠密 Embedding
        zvec.VectorSchema(
            name="image_vec",
            data_type=zvec.DataType.VECTOR_FP32,
            dimension=512,
            # 使用 HNSW 索引进行相似度搜索,余弦距离度量
            index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE),
        ),
        # 商品描述的稠密 Embedding
        zvec.VectorSchema(
            name="description_vec",
            data_type=zvec.DataType.VECTOR_FP32,
            dimension=768,
            # 启用量化以加速相似度搜索
            index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE, quantize_type=zvec.QuantizeType.INT8),
        ),
        # 商品关键词的稀疏向量
        zvec.VectorSchema(
            name="keywords_sparse",
            data_type=zvec.DataType.SPARSE_VECTOR_FP32,
            # 使用 HNSW 索引进行相似度搜索,内积度量
            index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.IP),
        ),
    ],
)

collection = zvec.create_and_open(  
    path="path/to/collection",
    schema=collection_schema,
    option=zvec.CollectionOption(read_only=False, enable_mmap=True),
)

目录